1

式内で 2 番目のダイジェスト サイクルをトリガーする方法を考えています$watch。1 つの$watch式内で可能なダイジェスト サイクルは 1 つだけのようです。電話をかけようとしまし$applyたが、「ダイジェストが既に進行中です」というメッセージが表示されてクラッシュします。

function TestCtrl($scope) {
    var purchase_orders = [
        {id : 1, name : 'Purchase Order One', multiple_day_rates : true },
        {id : 2, name : 'Purchase Order Two', multiple_day_rates : false },
        {id : 3, name : 'Purchase Order Three', multiple_day_rates : true } ];

$scope.purchase_orders = purchase_orders;

$scope.$watch(
    "poId",
    function( poId ) {
        console.log("watch triggered for po id");
        $scope.multiple_day_rates = null; //seems to have no effect..
        //$scope.$apply(function () {
        //          $scope.multiple_day_rates = null;
        //        }); --> throws digest already in progress
        var purchase_order_obj = jQuery.grep($scope.purchase_orders, function(e){ return e.id == $scope.poId; });
        if(typeof purchase_order_obj[0] != 'undefined'){
            if(purchase_order_obj[0].multiple_day_rates == true){
                console.log("before setting multiple day rates to true");
                $scope.multiple_day_rates = true;
            }
            else{
                console.log("before setting multiple day rates to false");
                $scope.multiple_day_rates = false;
                $scope.day_rate_check=true;
            }
        }
      }
    ); 

$scope.$watch(
    "multiple_day_rates",
    function( multiple_day_rates ) {
        console.log("watch triggered for multiple day rates");
        }
    ); 
}

私の目標は、$scope.multiple_day_ratesが設定されたら、いくつかのコードを実行したいということです。trueからに設定されている場合も検出したいと思いtrueます。AngularJS はある種のダーティ チェックを行っているため (値が変更された場合にのみ監視をトリガーします) $scope.multiple_day_rates、変更が検出されるように、事前に null に設定する必要があります。しかし、どういうわけか、$watch1 回のダイジェスト サイクルしかできない式のように見えます。これがJSFiddleです。選択が「Purchase Order One」から「Purchase Order Two」に変更されたときに、multiple_day_rates両方の場合と同様に何も起こらないことがわかりますtrue

4

1 に答える 1

1

これはあなたが達成しようとしていることですか?

function TestCtrl($scope, $timeout) {
    var purchase_orders = [{
        id: 1,
        name: 'Purchase Order One',
        multiple_day_rates: true
    }, {
        id: 2,
        name: 'Purchase Order Two',
        multiple_day_rates: false
    }, {
        id: 3,
        name: 'Purchase Order Three',
        multiple_day_rates: true
    }];
    $scope.purchase_orders = purchase_orders;

    $scope.$watch(
        "poId",
        function (poId) {
            console.log("watch triggered for po id");
            $scope.multiple_day_rates = null; //seems to have no effect..
            //$scope.$apply(function () {
            //          $scope.multiple_day_rates = null;
            //        }); --> throws digest already in progress
            $timeout(function () {
                var purchase_order_obj = jQuery.grep($scope.purchase_orders, function (e) {
                    return e.id == $scope.poId;
                });
                if (typeof purchase_order_obj[0] != 'undefined') {
                    if (purchase_order_obj[0].multiple_day_rates == true) {
                        console.log("before setting multiple day rates to true");
                        $scope.multiple_day_rates = true;
                    } else {
                        console.log("before setting multiple day rates to false");
                        $scope.multiple_day_rates = false;
                        $scope.day_rate_check = true;
                    }
                }
            });
        }
    );

    $scope.$watch(
        "multiple_day_rates",
        function (multiple_day_rates) {
            console.log("watch triggered for multiple day rates");
        }
    );
}

http://jsfiddle.net/qhnr5/

于 2013-06-27T15:08:29.970 に答える