Cordova页面缓存引发双按钮功能异常,求兼容cache:false的解决方案
解决方案:兼容
cache:false的双按钮修复方案 针对你在Cordova+AngularJS项目中遇到的tab.club-detail页面缓存互斥问题,以下是完全兼容cache:false的修复方案,确保两个按钮100%正常工作。
一、修复按钮2(二维码模态框):解决重开/刷新后二维码消失问题
问题根源
cache:false时,每次进入页面都会重新初始化控制器,原代码中依赖$interval轮询判断DOM是否渲染的逻辑不稳定,且全局DOM选择器可能获取到旧页面的元素,导致二维码无法正确生成。
代码修改
$scope.openTicketModal = function() { if ($scope.club.tickets.length > 0) { // 先显示模态框,触发DOM渲染 $rootScope.globalModalShow($scope.tixModal); // 监听模态框的shown事件(适配Ionic模态框的原生事件) $scope.tixModal.on('shown', function() { // 模态框DOM完全渲染后再生成二维码 $scope.genQRCode(); // 解绑事件,避免重复触发 $scope.tixModal.off('shown'); }); } else { pt = "TICKETS"; ps = "OOOOPPS"; pm = "It seems no tickets were purchased for this event."; ps1 = ''; pm1 = "If you believe this to be an error, please contact your event host admin."; pa = 0; $rootScope.globalPopover(pt,ps,pm,ps1,pm1,pa); return; } }; $scope.genQRCode = function() { $scope.refreshTickets = 1; clubService.getTickets($scope.club.cID,$scope.club.clID,$scope.club.ceID) .then(function(response) { $scope.refreshTickets = 0; if (response.success == true) { // 更新scope中的票据数据,确保ng-repeat正确渲染 $scope.club.tickets = response.tickets; // 用$timeout确保AngularJS完成 digest 循环,DOM更新完成 $timeout(function() { for (var x=0;x<response.tickets.length;x++) { var ticket = response.tickets[x]; $scope.ticketCSS[ticket.ticketID] = {}; // 使用AngularJS原生DOM选择器,避免全局函数的上下文问题 var ticketEl = angular.element('#ticketID_'+ticket.ticketID); ticketEl.empty(); // 原状态判断逻辑保留 if (ticket.scode == 0) { var ts = new Date(new Date().getTime() + 5 * 60000).toISOString().slice(0,19).replace("T"," "); $scope.ticketCSS[ticket.ticketID].status = "Open"; $scope.ticketCSS[ticket.ticketID].stampTitle = "Refresh"; $scope.ticketCSS[ticket.ticketID].stampText = ts; $scope.ticketCSS[ticket.ticketID].img = "img/LiveScanner.gif"; $scope.ticketCSS[ticket.ticketID].stampColor = "black"; } else if (ticket.scode == 1) { var tsTemp = ticket.sdate.replace(/-/g, "/"); var ts = new Date(tsTemp).toISOString().slice(0,19).replace("T"," "); $scope.ticketCSS[ticket.ticketID].status = "Scanned"; $scope.ticketCSS[ticket.ticketID].stampTitle = "Scanned"; $scope.ticketCSS[ticket.ticketID].stampText = ts; $scope.ticketCSS[ticket.ticketID].stampColor = "green"; $scope.ticketCSS[ticket.ticketID].img = "img/scanned1.png"; } else if (ticket.scode == 2) { var tsTemp = ticket.sdate.replace(/-/g, "/"); var ts = new Date(tsTemp).toISOString().slice(0,19).replace("T"," "); $scope.ticketCSS[ticket.ticketID].status = "Expired"; $scope.ticketCSS[ticket.ticketID].stampTitle = "Expired"; $scope.ticketCSS[ticket.ticketID].stampText = ts; $scope.ticketCSS[ticket.ticketID].img = "img/expired.png"; $scope.ticketCSS[ticket.ticketID].stampColor = "red"; } $scope.ticketCSS[ticket.ticketID].refunds = ticket.ticketRefund == 0 ? "No" : "Yes"; $scope.ticketCSS[ticket.ticketID].trans = "No"; $scope.ticketCSS[ticket.ticketID].desc = ticket.ticketDesc; // 生成二维码 ticketEl.qrcode({width:150,height:150,text:ticket.liveCode}); } }); } }) .catch(function(err) { $scope.refreshTickets = 0; // 可添加错误提示逻辑 }); }; // 页面销毁时清理资源,避免内存泄漏 $scope.$on('$destroy', function() { if ($scope.ticketInit) $interval.cancel($scope.ticketInit); if ($scope.ticketTimer) $interval.cancel($scope.ticketTimer); if ($scope.tixModal) $scope.tixModal.off('shown'); });
二、确保按钮1(相机视图)在cache:false下稳定工作
按钮1在cache:false时已正常,只需确保每次进入页面时状态重置正确:
// 监听页面进入事件,重置相机视图初始状态 $scope.$on('$ionicView.beforeEnter', function() { $scope.scannerOn = 0; // 强制初始化为关闭状态,避免遗留旧状态 scannerBox(0); });
核心修复逻辑
- 替代不稳定的轮询:用模态框
shown事件确保DOM完全渲染后再生成二维码,避免依赖$interval的概率性成功 - 上下文正确的DOM选择:使用AngularJS原生
angular.element替代全局函数,确保每次控制器实例都获取当前页面的DOM - 状态重置与资源清理:页面进入时重置相机视图状态,销毁时清理定时器和事件监听,避免内存泄漏和幽灵状态
- 遵循AngularJS生命周期:用
$timeout确保数据更新后DOM完成渲染,符合AngularJS的digest循环机制
内容的提问来源于stack exchange,提问作者rolinger
相关产品推荐
相关产品推荐

