Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/407.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript AngularJs-一个$watch函数中的多个应用/摘要周期_Javascript_Angularjs - Fatal编程技术网

Javascript AngularJs-一个$watch函数中的多个应用/摘要周期

Javascript AngularJs-一个$watch函数中的多个应用/摘要周期,javascript,angularjs,Javascript,Angularjs,我想知道如何在$watch表达式中触发第二个摘要周期。在$watch表达式中,似乎只有一个摘要周期是可能的。我试图调用$apply,但它因消息“摘要已在进行中”而崩溃 我的目标是,当设置了$scope.multiple_day_rates时,我想运行一些代码。我还想检测它何时从true设置为true。由于AngularJS正在进行某种脏检查(只有在值发生变化时才会触发watch),我必须将$scope.multiple_day_rates设置为null,以便检测到变化。但不知何故,在$watch

我想知道如何在
$watch
表达式中触发第二个摘要周期。在
$watch
表达式中,似乎只有一个摘要周期是可能的。我试图调用
$apply
,但它因消息“摘要已在进行中”而崩溃


我的目标是,当设置了
$scope.multiple_day_rates
时,我想运行一些代码。我还想检测它何时从
true
设置为
true
。由于AngularJS正在进行某种脏检查(只有在值发生变化时才会触发watch),我必须将
$scope.multiple_day_rates
设置为null,以便检测到变化。但不知何故,在
$watch
表达式中,只有一个摘要周期是可能的。这是你的电话号码。您可以看到,当选择从“采购订单一”更改为“采购订单二”时,什么也不会发生,因为
多天费率
在这两个时间都是
true

这就是你想要达到的目标吗

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");
        }
    );
}

这就是你想要实现的目标吗

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");
        }
    );
}

如果您希望在调用digest时收到通知,请在没有侦听器的情况下注册手表,这是正确的,但我认为这对您没有帮助。您是否希望以其他方式修改多天费率(例如作为输入的模型)?如果没有,最简单的答案是为多天费率创建一个setter函数(并包括您希望在任何时候运行的任何逻辑,即使该值不变)。但是你想通过这个来实现什么呢?可能还有其他方法。在poId的watch表达式和另一个watch表达式中设置了多天费率。设置可变的多天费率后,将触发一个ajax调用来更新一些数据。也许setter函数是正确的方法,而不是依赖$watch表达式,特别是因为multiple_day_rates变量仅在一个控制器中更改。谢谢McCrohan,我会试试的。谢谢McCrohan,调用函数而不是等待改变解决了我的问题。这很容易,但有时你需要有人把你推向正确的方向。如果你想在《文摘》被称为“注册一块没有监听器的手表”时得到通知,杰伊是对的,但我认为这对你没有帮助。您是否希望以其他方式修改多天费率(例如作为输入的模型)?如果没有,最简单的答案是为多天费率创建一个setter函数(并包括您希望在任何时候运行的任何逻辑,即使该值不变)。但是你想通过这个来实现什么呢?可能还有其他方法。在poId的watch表达式和另一个watch表达式中设置了多天费率。设置可变的多天费率后,将触发一个ajax调用来更新一些数据。也许setter函数是正确的方法,而不是依赖$watch表达式,特别是因为multiple_day_rates变量仅在一个控制器中更改。谢谢McCrohan,我会试试的。谢谢McCrohan,调用函数而不是等待改变解决了我的问题。这很简单,但有时你需要有人把你推向正确的方向。事实上,我已经解决了这个问题,没有注意变化,但当我设置$scope.multiple_day_rates时,总是调用一个定义的函数。这很好,因为该值仅在此ctrl中更改。不管怎样,你正在做的事情很有趣。您正在超时结束第二个呼叫?这会触发另一个摘要周期吗?@Tom,它会将执行延迟到下一个摘要周期。当需要一些DOM操作时,您可能会发现它更有用。无论如何,我会接受你的回答,因为你完全回答了我的问题。事实上,我已经解决了这个问题,因为我没有注意更改,但在设置$scope.multiple_day_rates时总是调用定义的函数。这很好,因为该值仅在此ctrl中更改。不管怎样,你正在做的事情很有趣。您正在超时结束第二个呼叫?这会触发另一个摘要周期吗?@Tom,它会将执行延迟到下一个摘要周期。当需要一些DOM操作时,您可能会发现它更有用。无论如何,我会接受你的回答,因为你完全回答了我的问题。