4

ルートスコープで変数が変化するのを監視する関数を備えたコントローラーを備えたAngularアプリがあります。あれは、

angular.module('myApp').controller('myController', function($scope, $rootScope) {
    $rootScope.$watch('someVar', function() {
        console.log($rootScope.someVar);
    });
}

ただし、何らかの理由で $rootScope.someVar を「Hello」に変更すると、次のコンソール出力が得られます

> Hello
> Hello
> Hello

なぜこれを行うのですか?私は大規模なデータファイルを解析するプログラムを書いています。パフォーマンスが 3 倍向上することができれば、私の人生はもっと幸せになるでしょう。

4

2 に答える 2

2

監視の副作用によって変数が変更された場合、すべての変更が解決されるまで監視が再度呼び出されます。

したがって、ウォッチがトリガーされるアクション (someVar を変更するアクション) が someVar を更新する他のアクションをもたらす場合、カスケードが発生する可能性があります (Angular が十分に言う前に最大 10 回?)

于 2013-07-18T18:30:04.713 に答える
0

子コントローラーから$rootScopeの変数を監視し、このコントローラーをさらに「開く」という同様の問題がありました。コントローラーを開くたびに、角度が異なるウォッチャーを追加し、変数が変更されると、ウォッチャーがさらに起動するようです。

親コントローラー (AppCtrl) 内にウォッチャーを追加してカスタム イベントをブロードキャストし、子コントローラー (ChildCtrl) でそのイベントをリッスンしながら、この問題を解決しました。

アプリコントロール:

$rootScope.$watch('myVar', function(myVar){
    if(myVar){
        var obj = doSomethingWithMyVar(myVar);
        $scope.$broadcast('myEventName', obj);
    }
});

子コントロール:

$scope.$on('myEventName', function(event, obj){
    console.log(obj);
});
于 2014-07-23T20:34:01.457 に答える