3

カスタム AJS ディレクティブによって使用される一般的な AJS サービスがあります。
サービス内で promise が解決されるまで、自分の指示を保持する必要があります。私が読んだことから、これはディレクティブコントローラーを介して行われますが、ルート以外の例は見たことがありません。

サービスの約束が解決されるまで指示を遅らせるにはどうすればよいですか?

ここに画像の説明を入力

4

1 に答える 1

0

私も似たような状況です。私のディレクティブは、サードパーティのライブラリがいくつかの 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;

実際の例については、プランクを参照してください。

于 2013-12-29T13:00:21.763 に答える