2016-12-04 84 views
0

我遇到了指令的api暴露問題,以便與控制器進行交互。Angular:使用templateUrl在指令中破壞編譯鏈接排序

有一個簡化的jsfiddle來描述我的結構。

問題是指令有templateUrl屬性(我用template替換它在上面),它導致加載模板異步(根據this question正確的行爲)。

結果指令的控制器,主控制器,因此指令的API函數doWork未定義後(即使你把它包起來的東西,如$超時調用)被稱爲:

.controller('MainCtrl', function($scope, $timeout) { 
    $scope.api = {}; 

    $scope.init = function() { 
    $timeout(function() { 
     $scope.api.doWork(); 
    }) 
    } 

    $scope.init() 
}) 

還有就是涉及到的方法我介意 - 在指令的鏈接功能中使用事件,並訂閱$scope.api.doWork到該事件。但我對使用事件並不滿意。此外,如果某些指令以暴露api的方式相互嵌套,則不清楚如何處理這種情況。 另一方面,可以用template代替templateUrl--但在模板複雜佈局的情況下,這也是一個非常糟糕的決定。

因此,我在解決這類問題的方法上留了一點點。解決這個問題的最佳方法是什麼?也許有另一種技術來揭露指令的api(我受到了Andrej Kaurin在thread中的回答的啓發)?

回答

1

如果您使用的是Angular 1.5+並且正在使用組件,您可以嘗試使用$postLink$onInit函數link。否則,你只需創建onDoWork指令範圍屬性,然後應用一些功能從主控制器將被觸發,當doWork實際發生時(因爲我認爲該指令應該控制何時doWork,如果不是那麼也許你應該只是創建服務?)