AngularJs ng-repeat 中的 iframe 加载事件

Posted

技术标签:

【中文标题】AngularJs ng-repeat 中的 iframe 加载事件【英文标题】:Iframe load event inside an AngularJs ng-repeat 【发布时间】:2019-10-31 23:54:31 【问题描述】:

我正在尝试创建一个指令,以便在加载 ng-repeat 内的 iFrame 时进行一些元素操作。

下面的 CodePen 在 ng-repeat 的内部和外部都包含一个 iframe。指令初始化没有问题,但加载事件永远不会触发。

var app = angular.module('tester', []);

app.directive('iframeOnload', [function()
return 
    scope: 
        callBack: '&iframeOnload'
    ,
    link: function(scope, element, attrs)
      alert("Directive Init")
        element.on('load', function()
          alert("Load Event Fired")
            return scope.callBack();
        )
    
])

app.controller('MainCtrl', function($scope)     

  $scope.tester1 = function ()
    alert("Testing 1")
  

  $scope.tester2 = function ()
    alert("Testing 2")
  

  $scope.theTemplate = [
            
                Id: 1,                
                ElementId: 99,                                      
                Content: 'Element1',
                ElementHeight: 130,              
            ,
            
                Id: 2,
                ElementId: 98,                                      
                Content: 'Element2',
                ElementHeight: 320,              
            ,
            
                Id: 3,
                ElementId: 2,                                      
                Content: 'Element3',
                ElementHeight: 320,
            ];
);

.

<body ng-controller="MainCtrl">
    <iframe iframe-onload="tester2()"></iframe>
  <ul>    
    <li ng-repeat="element in theTemplate" id="li_element.Id"  style="position: relative; height:element.ElementHeightpx;">
      <iframe iframe-onload="tester1()" scrolling="no" frameborder="0" style="width: 100%; height:element.ElementHeightpx;" id="iframeElementelement.Id"></iframe>
      element.Content
    </li>
  </ul>
  </body>

https://codepen.io/jibber4568/pen/agZxgP

非常感谢任何指针。

【问题讨论】:

【参考方案1】:

您可以为此使用 angular element ready 方法。请尝试以下方法。

app.directive('iframeOnload', [function()
return 
    scope: 
        callBack: '&iframeOnload'
    ,
    link: function(scope, element, attrs)
      alert("Directive Init")
        element.ready(function()
          alert("Load Event Fired")
            return scope.callBack();
        )
    
])

【讨论】:

【参考方案2】:

这是因为你没有使用 jQuery,因此 AngularJs 使用它自己的 jqLit​​e,来自 docs。

on() - 不支持命名空间、选择器或 eventData

你可以在 DOM 节点上使用原生的addEventListener,所以你的链接函数会是这样的:

link: function (scope, $element, attrs) 
  console.log('Directive Init');
  var element = $element[0];
  element.addEventListener('load', function () 
    console.log('Load Event Fired');
    return scope.callBack();
  ,  once: true );

【讨论】:

以上是关于AngularJs ng-repeat 中的 iframe 加载事件的主要内容,如果未能解决你的问题,请参考以下文章

ng-repeat angularJS 中的 ng-repeat

angularJS中的ng-repeat指令!

ng-repeat中的Angularjs分页

AngularJs 使用自定义 Json 中的 ng-repeat 创建表

由于 angularjs 中的 ng-repeat 导致的错误

如何使用AngularJS从ng-repeat中的数组中删除对象?