Angular:使用templateUrl打破指令

时间:2016-12-04 21:08:52

标签: angularjs angularjs-directive

我遇到了暴露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)?

1 个答案:

答案 0 :(得分:1)

如果您使用的是Angular 1.5+并且正在使用组件,则可以尝试使用$postLink$onInit函数link。否则,您只需创建onDoWork指令范围属性,然后从主控制器应用一些函数,当doWork实际发生时将触发该函数(因为我认为该指令应控制何时到doWork,如果那么也许你应该只创建服务?)