编辑(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?
原始请求:
在这个plunker
,http://plnkr.co/edit/Pcwaci5oQ0ANIslPlPmd中,我设置了一个计数变量,一个名称变量,并在$watch
内的$scope
上定义controller
。
我期望count的值最终解析为1,但它从初始化开始就保持不变。
答案 0 :(得分:4)
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()