【发布时间】:2016-03-13 21:29:56
【问题描述】:
我正在尝试使用其他人创建的指令来告诉我的指令什么时候它里面的 ngRepeat 完成了自己的创建。
我的外部指令有一个隔离范围,并且有一个需要由内部指令调用的范围函数。这是代码。
angular.module('my.directives')
.controller('myTableCtrl', function($scope, $element, $attrs) {
$scope.tableLoaded = function(tableName){
console.log("Table Loaded");
};
})
.directive('myTable', function() {
return {
restrict: 'EA',
scope: {},
controller: 'myTableCtrl as myTable'
};
})
.directive('repeatDone', function($timeout) {
return function(scope, element, attrs) {
if (scope.$last) {
$timeout(function(){
scope.$eval(attrs.repeatDone);
});
}
}
});
我的 HTML 看起来像这样。
<my-table>
<div ng-repeat="row in tableRows" repeat-done="tableLoaded('main');"></div>
</my-table>
在我将 scope:{} 添加到 myTable 指令之前,当页面上有多个表时会变得非常混乱(tableLoaded 函数被调用但被错误的孩子调用),所以我添加了隔离范围,我认为是最佳实践。不幸的是,repeatDone 指令现在无法查看/调用父 myTable 指令中的 tableLoaded() 函数。
任何帮助将不胜感激。
编辑:
只是为了澄清。 tableLoaded() 是 myTable 指令的一个函数,我希望能够从 repeatDone 指令中调用它,但它可能是 table 指令深处的元素。除此之外,我不想更改 repeatDone 指令,并且 repeatDone 不需要甚至不知道 myTable 指令。
【问题讨论】:
-
tableRows 在哪里定义?它不在您发布的任何源代码中。
-
在我的主页控制器中。此外,我将表格行模板简化为一个 div 以使其更易于阅读。这肯定是有效的,因为当我从 myTable 中删除隔离范围时,表中充满了数据,并且 tableLoaded() 函数被正确调用。
-
@jonhobbs 为什么不使用隔离作用域并将您的函数与“&”连接到内部指令?
-
不确定你的意思,你的意思是修改这个特定场景的repeatDone指令吗?如果是这样,那么这不是一个真正的选择。如果您的意思是有一种方法可以更改 table 指令,以便嵌套的 repeatDone 可以在其范围内调用函数,那么这正是我想要做的。
标签: javascript angularjs angularjs-directive angularjs-scope