我正在尝试创建指令,以便可以在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.ElementHeight}}px;">
<iframe iframe-onload="tester1()" scrolling="no" frameborder="0" style="width: 100%; height:{{element.ElementHeight}}px;" id="iframeElement{{element.Id}}"></iframe>
{{element.Content}}
</li>
</ul>
</body>
https://codepen.io/jibber4568/pen/agZxgP
非常感谢任何指针。
答案 0 :(得分:3)
您可以为此使用角度元素就绪方法。请尝试以下操作。
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();
})
}
}}])
答案 1 :(得分:0)
这样做的原因是由于您没有使用jQuery,因此AngularJs使用了自己的docs中的jqLite。
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 });
}