カスタム AJS ディレクティブによって使用される一般的な AJS サービスがあります。
サービス内で promise が解決されるまで、自分の指示を保持する必要があります。私が読んだことから、これはディレクティブコントローラーを介して行われますが、ルート以外の例は見たことがありません。
サービスの約束が解決されるまで指示を遅らせるにはどうすればよいですか?
私も似たような状況です。私のディレクティブは、サードパーティのライブラリがいくつかの DOM 操作を完了するのを待つ必要があります。再試行関数を使用して、必要な DOM 要素がまだ存在するかどうかを 50 ミリ秒ごとに確認します。
ディレクティブで:
Utils.retry(function() { return !!$(selector)[0]; }, 50, 10).then(function() {
doSomethingInterestingWith($(selector));
});
再試行機能 (私はこれを Utils サービスで定義しています):
var retry = function(fn, interval, maxTries) {
var result, deferred;
deferred = $q.defer();
// if we get a result, return it
result = fn();
if (result !== false) { deferred.resolve(result); }
else {
// if we've run out of tries, return false
if (maxTries) { maxTries -= 1; }
if (maxTries === 0) { deferred.reject('timed out'); }
// otherwise try again after interval
else {
$timeout(function() {
deferred.resolve(retry(fn, interval, maxTries));
}, interval);
}
}
return deferred.promise;
};
Utils.retry = retry;
実際の例については、プランクを参照してください。