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

iecba09b  于 2023-10-15  发布在  Angular
关注(0)|答案(1)|浏览(98)

我有一个模板PageA的控制器。PageA有一个模式,只有当用户单击按钮时才打开。在模态中是一个ng-repeat;使用ng-init,当ng-repeat完成时($last),然后调用genQRCode()函数。这样做是为了在qrcode <canvas>附加到DIV之前首先创建DIV,并将其添加到dom。
但问题是,一旦PageA加载,即使用户没有单击按钮打开Modal,也会调用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() ;    
  }  ;

我的期望是用户点击按钮,Modal打开,ng-repeat触发....然后在$last上触发genQRCode()函数。
是什么导致genQRCode()在模态打开之前就被触发了?

8oomwypt

8oomwypt1#

对于任何遇到这个问题的人,我解决了一个有点黑客修复。
在ng-repeat上,我删除了ng-init="$last && genQRCode()",并在Modal open函数中添加了$interval来检查ng-repeat的最后一个元素是否已渲染到DOM,当渲染完成时,触发genQRCode()函数。这是我唯一能想到的方法--在ng-repeat中添加ng-init或directive并没有帮助,因为当控制器/页面加载时,它们都会触发对genQRCode()的调用--而模态DOM元素还没有创建。

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

相关问题