我遇到了暴露api指令的问题,以便与控制器进行交互。
有一个简化的jsfiddle来描述我的结构。
问题是指令具有templateUrl
属性(我在上面的小提琴中用template
替换它),它导致加载模板异步(根据this question的正确行为)。
结果指令的控制器在主控制器之后被调用,因此指令的api函数doWork
是未定义的(即使你用$ timeout之类的方式调用它):
.controller('MainCtrl', function($scope, $timeout) {
$scope.api = {};
$scope.init = function() {
$timeout(function() {
$scope.api.doWork();
})
}
$scope.init()
})
我想到了一种方法 - 在指令的链接功能中使用事件,并为该事件订阅$scope.api.doWork
。但我对使用事件感到不满意。如果有一些指令以相似的方式暴露api,则不清楚如何处理这种情况。
另一方面,可以用templateUrl
替换template
- 但在模板中复杂布局的情况下,这也是非常糟糕的决定。
因此,我解决了解决此类问题的方法。解决问题的最佳方法是什么?可能还有另一种技术可以揭示指令的api(我的灵感来自Andrej Kaurin的回答thread)?
答案 0 :(得分:1)
如果您使用的是Angular 1.5+并且正在使用组件,则可以尝试使用$postLink
或$onInit
函数link。否则,您只需创建onDoWork
指令范围属性,然后从主控制器应用一些函数,当doWork
实际发生时将触发该函数(因为我认为该指令应控制何时到doWork
,如果那么也许你应该只创建服务?)