Javascript AngularJS从$watch抛出INFDIG,既不修改触发器也不修改触发器

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

在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.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)
}