-3

编辑(2013 年 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?


原始请求:在这个http://plnkr.co/edit/Pcwaci5oQ0ANIslPlPmdplunker中,我设置了一个计数变量、一个名称变量,并在.$watch$scopecontroller

我预计 count 的值最终会解析为 1,但它与初始化相比保持不变。

4

2 回答 2

4

++ 在变量之后意味着在右侧的值上加一(在赋值之后)......有趣的是,这也不完全符合我的预期,但是如果你放弃赋值(左边的东西)并增加它有效(因为 ++ 真的很像 $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
于 2013-07-17T19:17:03.347 回答
0

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

有关更多信息,请参阅有关范围的文档,尤其是$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()
于 2013-07-19T02:09:25.993 回答