1

テンプレートはプロミスまたは実際の値のいずれかにバインドでき、その値が変更されるとテンプレートが更新されることを知っています。

私はプロミスの変更を監視し、そのプロミスが更新されたときにディレクティブのデータをリロードする、ディレクティブで同様のことをしたいと考えています。

ただし、プロミスを見ると、変更を登録しているように見えますが、すぐに「未定義」に設定されます。

http://plnkr.co/edit/eOjkuvyrQvKhkAbVLGVG?p=previewを参照してください。

ご覧のとおり、テンプレートは問題なく更新されていますが、コンソールを確認すると、「isNotAPromise」ウォッチは期待どおりに動作しますが、「isAPromise」ウォッチは 2 回トリガーされ、どちらも「未定義」です。

手がかりはありますか?

SOを幸せにするコードは次のとおりです。

app.controller('MainCtrl', function($scope, $q) {
  var c;
  c = 1;
  setInterval(function() {
    c = c + 1;
    console.log('---------------');
    console.log(['c changed to ', c]);
    return $scope.$apply(function() {
      $scope.isNotAPromise = c;
      return $scope.isAPromise = $q.when(c);
    });
  }, 1000);
  $scope.$watch('isAPromise', function(newVal, oldVal) {
    return console.log(['isAPromise changed', oldVal, newVal]);
  });
  return $scope.$watch('isNotAPromise', function(newVal, oldVal) {
    return console.log(['isNotAPromise changed', oldVal, newVal]);
  });
});

ありがとう、ロイ

4

1 に答える 1

2

2 つの時計がいつトリガーされたかを判断するために、タイムスタンプを追加しました。

console.log [+new Date(), 'isAPromise changed', oldVal, newVal]

出力例:

["c changed to ", 3] app.js:12
[1366223960472, "isAPromise changed", 2, undefined] app.js:19
["isNotAPromise changed", 2, 3] app.js:22
[1366223960473, "isAPromise changed", undefined, 3] 

したがって、2 つの時計isAPromiseは 1 ミリ秒間隔で起動しています。$q.when(c)が最初に に割り当てられたとき$scope.isAPromise、それはundefinedプロミスがまだ解決されていないためだと思います。次に、promise が解決され (おそらく、次の $digest ループ中に) isAPromise、(解決された?) promise の値に設定されます。

于 2013-04-17T18:49:23.687 に答える