2013-07-17 79 views
-3

编辑(18 Jul 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,我将计数变量,变量名,以及定义上$scope一个$watchcontroller内。

我期待计数的值最终解决为1,但它的初始化保持不变。

+3

$ scope.count = $ scope.count + 1; ++不能使用initilization,只需使用$ scope.count ++ –

+1

请包括足够的代码,以正确理解问题本身中的问题,而不是链接到plunker。 – Joe

回答

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() 
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