You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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);
});

核心修复逻辑

  1. 替代不稳定的轮询:用模态框shown事件确保DOM完全渲染后再生成二维码,避免依赖$interval的概率性成功
  2. 上下文正确的DOM选择:使用AngularJS原生angular.element替代全局函数,确保每次控制器实例都获取当前页面的DOM
  3. 状态重置与资源清理:页面进入时重置相机视图状态,销毁时清理定时器和事件监听,避免内存泄漏和幽灵状态
  4. 遵循AngularJS生命周期:用$timeout确保数据更新后DOM完成渲染,符合AngularJS的digest循环机制

内容的提问来源于stack exchange,提问作者rolinger

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.05 20:50:54