$scope$控制器中的手表未按预期工作
$scope.$watch in Controller not working as expected
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
部分。在plunker
0部分下,有一个示例反映了您在上面尝试做的事情。
$scope.name = 'Bob';//should increment the value to 2
$scope.$digest()
$scope.name = 'Jane';//should increment the value to 3
$scope.$digest()
- Javascript:selenium Web驱动程序isDisplayed()不工作
- jQuery UI自动完成突然停止工作
- AngularJS UI路由器不能像ng路由器那样工作
- HTML5音频加载和播放获胜'我不能在iPad上工作
- JavaScript打印功能使日历停止工作
- Javascript.getHours()工作不正常
- 为什么这在IE中的工作方式与在Firefox中不同
- 视频HTML没有'无法在Internet Explorer 11上工作
- 扩展移相器按钮类不工作
- Firebase迁移-简单的Firebase.set没有'不再工作了——旧的还是新的
- 谷歌地图不是以HTML显示,而是在JS Fiddle上工作
- 正在尝试使用if和else添加类,但无法正常工作
- 转换成ES 5使用babel通过吞咽手表不工作
- $scope$Angular中的手表;我不在爱奥尼亚/科尔多瓦工作
- 指令中的指令-手表不工作
- $scope$控制器中的手表未按预期工作
- Typescript -w(手表)不工作在我的安装
- 丑不工作与咕噜手表
- 角指令窗口偏移手表不工作
- 因果报应——自动手表不再工作