3

この単純なコントローラーマークアップがあります

<div ng-controller="TestCtrl" ng-show="isVisible()">
    <input type="text" ng-model="smth"/><br>
    <span>{{smth}}</span>
</div> 

そしてコントローラー自体

function TestCtrl($scope, $log)
{
    $scope.smth = 'smth';

    $scope.isVisible = function(){
        $log.log('isVisible is running');

        return true;
    }
}

モデルを少し変更するたびに (テキスト ボックス内の 1 文字を変更するなど) isVisible is running、コンソールに表示されるのはなぜですか? そのような場合は問題ありませんが、応用範囲が広いと思います。これを避けることはできますか?

4

2 に答える 2

5

Liviu T. は正しいです。isVisibleスコープが変更されるたびに関数が実行されることを避けることはできません。Angular がこの関数を再実行しなかった場合、残りのコードと同期しなくなる可能性があります (たとえば$scope.smth、戻り値を解決するためにモデルを使用していた場合)。

ng-hide、ng-show、ng-class などのディレクティブは常に再- $digest サイクルごとに、それらに割り当てられた式を評価します。

もう一度実行したくない場合は、関数の出力をキャッシュするためのメモ化手法を試してみてください。

于 2013-03-03T19:48:10.377 に答える
3

これは、AngularJS がその「魔法」を行う方法の不可欠な部分であるため、正常です。この回答には詳細があります: https://stackoverflow.com/a/9693933/1418796

パフォーマンスの問題が発生しないようにするためのさまざまな手法がありますが、一般に、これらの式を評価から除外することはできません。

于 2013-03-03T19:42:58.070 に答える