Javascript AngularJS从$watch抛出INFDIG,既不修改触发器也不修改触发器
在AngularJS脚本中,我只有1个Javascript AngularJS从$watch抛出INFDIG,既不修改触发器也不修改触发器,javascript,angularjs,Javascript,Angularjs,在AngularJS脚本中,我只有1个$watch,如下所示: $scope.$watch('[p, q]', function(newVals, oldVals) { $scope.n = newVals[0] * newVals[1]; $scope.phi = (newVals[0] - 1) * (newVals[1] - 1); }); 函数既不修改p也不修改q,为什么抛出infdigs Error: [$rootScope:infdig] http://errors
$watch
,如下所示:
$scope.$watch('[p, q]', function(newVals, oldVals) {
$scope.n = newVals[0] * newVals[1];
$scope.phi = (newVals[0] - 1) * (newVals[1] - 1);
});
函数既不修改p
也不修改q
,为什么抛出infdigs
Error: [$rootScope:infdig] http://errors.angularjs.org/1.3.0-beta.5/$rootScope/infdig?p0=10&p1=%5B%5B%…%20q%5D%3B%20newVal%3A%20%5B5%2C7%5D%3B%20oldVal%3A%20%5B5%2C7%5D%22%5D%5D
at Error (native)
at https://ajax.googleapis.com/ajax/libs/angularjs/1.3.0-beta.5/angular.min.js:6:456
at h.$digest (https://ajax.googleapis.com/ajax/libs/angularjs/1.3.0-beta.5/angular.min.js:107:164)
at h.$apply (https://ajax.googleapis.com/ajax/libs/angularjs/1.3.0-beta.5/angular.min.js:109:287)
at https://ajax.googleapis.com/ajax/libs/angularjs/1.3.0-beta.5/angular.min.js:18:23
at Object.d [as invoke] (https://ajax.googleapis.com/ajax/libs/angularjs/1.3.0-beta.5/angular.min.js:34:211)
at c (https://ajax.googleapis.com/ajax/libs/angularjs/1.3.0-beta.5/angular.min.js:17:439)
at cc (https://ajax.googleapis.com/ajax/libs/angularjs/1.3.0-beta.5/angular.min.js:18:140)
at ed (https://ajax.googleapis.com/ajax/libs/angularjs/1.3.0-beta.5/angular.min.js:17:215)
at https://ajax.googleapis.com/ajax/libs/angularjs/1.3.0-beta.5/angular.min.js:212:459 angular.js:9784
Uncaught Error: [$rootScope:infdig] http://errors.angularjs.org/1.3.0-beta.5/$rootScope/infdig?p0=10&p1=%5B%5B%…%5B5%2C7%5D%22%5D%2C%5B%22%5Bp%2C%20q%5D%3B%20newVal%3A%20%5B5%2C7%5D%3B%2...<omitted>...5D angular.js:12453
一些HTML
<label>Enter a prime p:</label>
<input type="number" ng-model='p'>
<br/>
<label>Enter a prime q:</label>
<input type="number" ng-model='q'>
<br/>
<p ng-show='isPrime(p)'> p = {{p}} </p>
<p ng-show='isPrime(q)'> q = {{q}} </p>
输入一个素数p:
输入质数q:
p={{p}
q={{q}
在
{{}
s中没有赋值。监视中的第一个参数是在作用域上下文中计算的表达式。表达式是[p,q]
,每次都会创建一个新数组。这个新的引用触发了一个新的摘要循环,因此是无限循环。您只是想在p
或q
更改时运行该逻辑吗?只需分别观察它们并调用相同的函数
function doStuff(p, q)
{
$scope.n = p * q;
$scope.phi = (p - 1) * (q - 1);
}
$scope.$watch('p', function(newVal) {
doStuff(newVal, $scope.q)
}
$scope.$watch('q', function(newVal) {
doStuff($scope.p, newVal)
}
然后如何使用
$scope.n
和$scope.phi
?在模板中?@MichalCharemza与在{{}中一样?对但这不应该启动循环,对吗?我认为这取决于它的使用方式:比如说,如果它被分配给其他变量,这可以在{}
插值表达式中完成。你能发布它/它们吗?n和phi是否以某种方式绑定到p和q?是否有类似于$scope.p=$scope.n*$scope.phi代码>?如果是这样,请确保它们没有使用angular.copy()
@MichalCharemza添加了相关代码/html进行绑定。谢谢!您是否可以同时观看多个元素(例如,“[p,q]”),而不发生这种情况?您可以使用函数而不是字符串,只返回您想要触发侦听器的任何内容。
function doStuff(p, q)
{
$scope.n = p * q;
$scope.phi = (p - 1) * (q - 1);
}
$scope.$watch('p', function(newVal) {
doStuff(newVal, $scope.q)
}
$scope.$watch('q', function(newVal) {
doStuff($scope.p, newVal)
}