$scope$控制器中的手表未按预期工作

$scope.$watch in Controller not working as expected

本文关键字:工作 手表 scope 控制器      更新时间:2023-09-26

Edit(13年7月18日):根据你的建议,我对代码做了一点修改,代码在这里: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?


原始请求:在该CCD_ 1中,http://plnkr.co/edit/Pcwaci5oQ0ANIslPlPmd,我正在设置计数变量、名称变量,并在controller内部的$scope上定义$watch

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

++在变量后表示在右边的值上加一(赋值后)。。。有趣的是,这也不是我所期望的那样,但如果你去掉赋值(左边的东西),只增加它就可以了(因为++真的很像$scope.count=$scope.count+1)。在angular之外的"正常"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

这与以下事实有关:只有在调用$digest()时才会检查$scope的更改。当控制器函数退出时,这种情况会隐式发生,因此无论您在函数内部更改了多少次,从函数外部来看,它似乎只更改了一次。如果要强制进行更改,可以显式调用$digest()。这通常在测试场景中进行,但在大多数常规控制器中用处有限。

有关更多信息,请参阅有关作用域的文档,特别是$watch$digest部分。在plunker0部分下,有一个示例反映了您在上面尝试做的事情。

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