2

私は非常に単純な答えの質問をしていることを知っています(私はAngularに不慣れであり、ここでこれを尋ねるには多くの勇気が必要でした;)。次のような時刻を表示するディレクティブがあります。

Application.Directives
.directive('theClock', function(){
    return {
        retrict: 'EA',
        templateUrl: 'partials/partial.clock.html',
        link: function(scope, elem, attrs) {

            scope.dTime = Date();
            scope.$watch( function(scp){ return Date(); }, function(newVal){ 

                    scope.dTime = newVal;
                }
            );
        }
    };
});

時間は$digestサイクルごとに更新されると思いますが、更新されません。setIntervalotを使用することもこれを行う別の方法であることを私は知って$timeoutいますが、私は本当に時計が必要ではありません。更新が行われない理由を理解したいと思います。ところで、私は$apply()チェックした後に電話をしました$$phase-助けにはなりませんでした

ありがとうございました。

4

2 に答える 2

5

$ watch関数は、デフォルトで参照によってオブジェクトを比較します。これは、文字列/数値の値では高速で問題ありませんが、Dateなどの複雑なオブジェクトでは機能しません。Dateは変更される可能性がありますが、常に同じDateオブジェクトであるため、参照変わらない。

これは、巨大なアレイでの重い等式テストを回避するためです。

さて、これは機能するかもしれませんが($ watch関数の3番目のパラメーターがtrueに設定されていることに注意してください):

scope.dTime = new Date();
scope.$watch( function(scp){ return new Date(); }, function(newVal){ 

  scope.dTime = newVal;
  }, true
);

$ watch関数をポーリングするたびに(つまり、アプリの1サイクルごとに)変更イベントがトリガーされる可能性があります。

1秒ごとにトリガーする場合は、return Math.floor(new Date()。valueOf()/ 1000)のように、Date()から秒を返します。次に、必要に応じてdTimeを設定します。

アップデート

Angularのチェックはで機能しreturn Date()ますが、問題はAngularのダーティチェックシステムが原因です-モデル($ scope内で定義されたモデルを意味する)で変更がトリガーされた場合にのみ$watch関数をチェックします。

Valentyn ShybanovからフォークされたこのPlnkrは、例として役立ちます。時計関数はモデルの変更をトリガーし、その変更は$watch関数をトリガーします。

また、 window.setTimeoutを使用するこのバージョンに注意してください。$ applyメソッドを使用してのみ機能し、angularJSに変更が発生したことを通知します。

于 2013-01-09T13:15:45.493 に答える
2

「更新が行われない理由を理解したい。」

この写真(概念の概要ページから)がそれを最もよく説明していると思います:

角度イベントループ

$ apply()が呼び出されない限り、$watchリストは調べられません。$ applyは、「$digestループ」に入る方法です。多くの(すべて?)Angular組み込みディレクティブは自動的に$ applyを呼び出します(したがって、そうする必要はありません)。たとえば、@ Tiagoがすでに述べたように、バインドされた$ scopeプロパティ(Angular内)を変更すると、$applyが呼び出されます。$ applyを自分で明示的に呼び出すこともできます(たとえば、定義したサードパーティのライブラリコールバック関数の内部から-ここで$ applyを呼び出さない場合、$ digestループに入りません)。

結論:青いボックス(「Angular実行コンテキスト」)に入らない限り、$ watchリストは調べられないため、ダーティチェックは実行されません。

于 2013-01-09T17:49:34.433 に答える