cordova 页面加载正在触发未打开的 Modal ng-repeat 脚本运行

cordova page load is triggering unopened Modal ng-repeat scripts to run

提问人:rolinger 提问时间:8/15/2023 更新时间:8/16/2023 访问量:10

问:

我有一个模板PageA的控制器。PageA 上有一个模态,只有在用户单击按钮时才会打开。在模态中是一个 ng-repeat;使用 ,当 ng-repeat 完成 () 时,将调用该函数。这样做是为了在将 qrcode 附加到 DIV 之前首先创建 DIV,将其添加到 dom 中。ng-init$lastgenQRCode()<canvas>

但问题是,一旦 PageA 加载,即使用户没有单击按钮打开模态,也会调用genQRCode()

按钮:

<button ng-click="openTicketModal();" class="button button-block button-large-custom" style="">View Tickets</button>

模 态

<div ng-repeat="ticket in club.tickets" id="ticketID_{{ticket.ticketID}}" ng-init="$last && genQRCode()">

  ... qrCode will be attached here in a <canvas> ...

</div>

控制器

  $scope.genQRCode = function() {
    for (var x=0;x<$scope.club.tickets.length;x++) {
      var ticket = $scope.club.tickets[x] ;

      angular.element(document.querySelector('#ticketID_'+ticket.ticketID)).empty() ;
      
      jQuery('#ticketID_'+ticket.ticketID).qrcode({width:150,height:150,text:ticket.qrString}) ;
    }
  } ;

  $ionicModal.fromTemplateUrl('ticketModal.html', {
    scope: $scope,
    animation: 'slide-in-up',
    backdrop: 'static',
    backdropClickToClose:false,
    focusFirstInput: false 
  }).then(function(modal) {
    $scope.tixModal = modal;
  });
  
  $scope.openTicketModal = function(id) {
    $scope.tixModal.show() ;
  } ;
  $scope.closeTicketModal = function(id) {
     $scope.tixModal.hide() ;    
  }  ;

我的期望是用户单击按钮,模态打开,ng-repeat 触发......然后在一个触发函数。$lastgenQRCode()

是什么原因导致在模态打开之前就被触发?genQRCode()

jQuery AngularJS Cordova 控制器 模式对话框

评论


答:

0赞 rolinger 8/16/2023 #1

对于遇到此问题的任何人,我都解决了一些棘手的问题。

在 ng-repeat 上,我删除了 和 在模态打开函数中,我添加了一个以检查 ng-repeat 的最后一个元素是否已呈现到 DOM,当它呈现时,然后触发 genQRCode() 函数。它有效。这是我唯一能弄清楚的工作 - 将 ng-init 或 a 添加到 ng-repeat 无济于事,因为它们都在控制器/页面加载时触发了调用 - 并且尚未创建模态 DOM 元素。ng-init="$last && genQRCode()"$intervaldirectivegenQRCode()

  $scope.openTicketModal = function() {
    $scope.ticketInit = $interval(function() {
      $scope.refreshTickets = 1 ;
      var tid = $scope.club.tickets.length-1 ;
      if (angular.element('#ticketID_'+tid)) {
        $interval.cancel($scope.ticketInit) ;
        $scope.genQRCode() ;
      }
    },100) ;
    $scope.tixModal.show() ;
  }

评论

0赞 rolinger 8/16/2023
我的解决方案有效...在关闭模式之前,路由到其他页面 - 然后路由回模式页面并再次打开模式。ng-repeat DIV 都在那里,但 jQuery qrCode 生成器无法再次附加图像。从头再来。