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操作时,您可能会发现它更有用。无论如何,我会接受你的回答,因为你完全回答了我的问题。