$ scope。$ watch in Controller未按预期工作

时间:2013-07-17 18:44:04

标签: javascript angularjs

编辑(7月18日13日):根据您的建议,我对代码进行了一些修改,代码在这里:http://plnkr.co/edit/Pcwaci5oQ0ANIslPlPmd但它仍然无法正常工作。这个例子是一个简单的测试,看看$ watch是如何工作的。我正在设置一个变量并在该变量上定义$ watch,然后两次更新监视变量。似乎$ watch只被调用一次,但我希望它被调用3次(包括初始调用,但我也想知道如何使第一次调用可选)。

$scope.name = 'World'; //initial assignment
$scope.count = 0;
$scope.$watch('name', function(){
    $scope.count++;
});

$scope.name = 'Bob';//should increment the value to 2
$scope.name = 'Jane';//should increment the value to 3

为什么在此代码运行后$ scope.count等于1?


原始请求: 在这个plunkerhttp://plnkr.co/edit/Pcwaci5oQ0ANIslPlPmd中,我设置了一个计数变量,一个名称变量,并在$watch内的$scope上定义controller

我期望count的值最终解析为1,但它从初始化开始就保持不变。

2 个答案:

答案 0 :(得分:4)

变量之后的变量意味着在右边的值中添加一个(在赋值之后)...有趣的是,这并不是我所期望的那样,但如果你放弃了赋值(左边的东西)和只是增加它的工作原理(因为++真的像$ scope.count = $ scope.count + 1)。在角度以外的“普通”javascript中也是如此:

var y=5;
y=y++;
console.log(y); //5

显然它必须存储右侧的值,然后增加右侧,然后将存储的值分配给左侧。

$scope.count=0;
$scope.count++; //this results in 1

然而

$scope.count=0;
$scope.count=$scope.count++; //this results in 0

或者你可以预先增加它

$scope.count=0;
$scope.count=++$scope.count; //this results in 1

答案 1 :(得分:0)

这与$scope仅在调用$digest()时检查更改的事实有关。当你的控制器功能退出时会隐式发生这种情况,所以无论你在函数内部改变它多少次,从函数外部看它只会改变一次。如果要强制进行更改,可以显式调用$digest()。这通常在测试场景中完成,但在大多数常规控制器中实用性有限。

有关详细信息,请参阅scopes上的文档,尤其是$watch$digest部分。在$watch部分下,有一个示例反映了您在上面尝试执行的操作。

$scope.name = 'Bob';//should increment the value to 2
$scope.$digest()
$scope.name = 'Jane';//should increment the value to 3
$scope.$digest()