6

こんにちは、次の問題があります。

私の見解では、関数 prepareDynamicData(itemMenu); を呼び出します。

<div ng-repeat="itemMenu in menuDetailsData.categories" class="headDetails fontH2">
            <div style="display: none">{{prepareDynamicData(itemMenu)}}</div>
            <a href="#" ng-show="dynamicData.expand">{{itemMenu.name}}</a>
            <div ng-repeat="cat in dynamicData.data">
                <p>{{cat.name}}</p>
                <div class="articles">
                    <div ng-repeat="art in cat.items" class="article">
                        <div class="price">
                            <div></div>
                            <span><i>₪&lt;/i>{{art.price}}</span>
                        </div>
                        <div class="artDescr">
                            <span class="fontTitle">{{art.title}}</span>
                            <p class="fontDetails">{{art.description}}</p>
                        </div>
                    </div>
                </div>
            </div>
        </div>

トップ ループが 2 回しか繰り返されていないことはわかっていますが (検証済み)、関数 prepareDynamicData(itemMenu) が 4 回呼び出しているのですが、理由がわかりません!? これが私のコントローラーです:

function MenuItemCtrl($scope, $routeParams, $http, $location, sharedData) {
if (sharedData.getMenuDetails() == null) {
    $location.path('/menu');
    return;
}
else {
    $scope.menu = sharedData.getMenu();
    $scope.menuDetailsData = sharedData.getMenuDetailsData($routeParams.itemId);
}

$scope.dynamicData = {
    data : new Array(),
    expand : false
};

$scope.prepareDynamicData = function (itemMenu) {
    if (itemMenu.items != null) {
        $scope.dynamicData.data[0] = itemMenu;
        $scope.dynamicData.expand = false;
    }
    else {
        $scope.dynamicData.data = itemMenu.categories;
        $scope.dynamicData.expand = true;
    }
}

}

なぜそれが起こっているのかを明確にするのを手伝ってくれませんか!ありがとう

4

1 に答える 1

9

AngularJS はダーティ トラッキングを使用して、ビューが最新の状態に保たれるようにします。つまり、AngularJS は、ビューのバインディングの値が安定するまで評価します。したがって、バインディングの関連付けられたスコープが更新されるたびに、バインディングごとに少なくとも 2 回これが行われます。(たとえば、ループ内部の特定の項目が変更された場合、さらに 2 回実行される可能性があります。) これが、ビューにバインドされた関数に副作用がなく、迅速に実行されるように注意する必要がある理由です。

一般に、データ準備タスクをコントローラーのロード時に実行されるコードに移動するか、コントローラーから呼び出されるサービスに移動することをお勧めします。ビュー関連のコードに副作用が生じることはほとんどありません。ただし、ビューからこのような関数を呼び出す必要がある場合、または本当に呼び出したい場合は、関数が特定のアイテムに対して既に呼び出されているかどうかを追跡するだけです。

興味がある場合は、Angular のダーティ トラッキングに関する追加情報を参照してください。

于 2013-04-21T05:42:25.303 に答える