2012-09-08 9 views
15

AngularJSスコープで$ apply()は、すべてのイベントハンドラ(入力ディレクティブのキー入力/入力イベント、選択ディレクティブの変更イベントなど)およびその他の場合に呼び出されます。

small exampleを参照してください。他のスコープで変更が発生しているにもかかわらず、すべてのkeydownでngRepeatが再計算され再描画されているようです。

このような決定の根拠を知ることは興味深いでしょう。

答えて

17

これはAngularJSの著者には素晴らしいことですが、$ rootScopeで$ digest()を呼び出す必要があると思います。なぜなら、リピータのトリガは他のスコープ(さらには$ rootScope) 。

子スコープでトリガーされたメソッドが親スコープのオブジェクトに影響を与える可能性があります(子スコープは親スコープから継承するため)。したがって、子スコープで定義された関数がオブジェクトを親スコープから参照に変更できない場合でも、親スコープで定義されたオブジェクトの値を変更できます。

上記それでは、アイテムのリストを持つ(ビット人工)の例を検討してみましょう少し不可解に聞こえるかもしれません:

$scope.items = [{name: 'foo', value:0}, {name: 'bar', value:0}, {name: 'baz', value:0}]; 

、上記のリストを表示し、のがあることを言わせする使用はNG-を繰り返してみましょう項目をクリックすると、の値が他のの項目に増えます(もう一度、この例は少し人工的ですが、ここでのポイントは、あるスコープでトリガーされたアクションが他のスコープで副作用を起こす可能性があることです)。正しい結果を表示するために - - 親スコープでウォッチャーを評価する必要性($ rootScopeまで私たちがどこかわからないので、例えば、機能は他のスコープとAngularJSの値を変更します

$scope.incOther = function(item) { 
     for (var i=0; i<$scope.items.length; i++){ 
      if ($scope.items[i] !== item){ 
       $scope.items[i].value++; 
      } 
     } 
    }; 

:それはこのように行くことができますオブジェクトが定義されました)。ここで

この説明完全jsFiddleです:jsFiddleの上に実際にhttp://jsfiddle.net/pkozlowski_opensource/Z6e5g/3/

をもウォッチャーの評価は実際に非常に先頭に開始する必要があることを示すために$ rootScope内のオブジェクトが含まれています。

+0

ありがとうございました。あなたは間違いなく正しいです。 $ parent.obj、$ parent. $ parent.objなどを使ってオブジェクト全体を変更することもできるので、親スコープでオブジェクトの値を変更できることを忘れていました。 –

関連する問題