2016-12-04 6 views
0

コントローラとのやりとりのために命令のapiを公開するという問題が発生しました。角度:templateUrlを使用すると指示文の中でコンパイルリンクの順序が壊れます

私の構造を表す簡略化されたjsfiddleがあります。

ディレクティブの属性がtemplateUrlである(上記のフィールドでtemplateに置き換えられました)、テンプレート非同期のロードにつながります(this questionによる正しい動作)。

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

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

    $scope.init() 
}) 

私に来るのアプローチがあります:メインコントローラはそのためのディレクティブのAPI関数doWorkは(あなたは$タイムアウトのようなもので呼び出し、それをラップする場合でも)定義されていませんした後、結果ディレクティブのコントローラーが呼び出されると

指示のリンク機能で心的使用のイベントを受信し、そのイベントに$scope.api.doWorkをサブスクライブします。しかし、私はイベントを使用することに満足していません。 apiを公開する同様の方法で互いにネストされたディレクティブがある場合、そのようなケースを処理する方法も明確ではありません。 一方、templateUrltemplateと置き換えることもできますが、テンプレートの複雑なレイアウトの場合は非常に間違っています。

このように、このような問題を解決する方法はちょっと残念です。それを修正する最良の方法は何ですか?おそらく、ディレクティブのapiを公開する別のテクニックがあります(私はAndrej Kaurinの答えがthreadであることに触発されています)。

答えて

1

Angular 1.5+を使用し、コンポーネントを使用している場合は、$postLinkまたは$onInitの機能linkを試してみることができます。それ以外の場合は、onDoWorkディレクティブスコープのプロパティを作成してから、doWorkが実際に起きるときに起動するメインコントローラの機能を適用します(doWorkに制御する必要があると思うので、サービスを作成する必要があります)

関連する問題