AngularJS$手表工作不正常
最近我正在学习Angularjs,我的代码似乎没有预期的效果: 这是我的AngularJS$手表工作不正常,angularjs,Angularjs,最近我正在学习Angularjs,我的代码似乎没有预期的效果: 这是我的div: <div ng-app="myApp"> <div ng-controller="myController"> <input type="text" ng-model="data.name" value=""/> {{data.count}} </div> </div> 我所期望的是,当我在框中键入某个内容时,{{data.count}将每次增加1。然而
div
:
<div ng-app="myApp">
<div ng-controller="myController">
<input type="text" ng-model="data.name" value=""/>
{{data.count}}
</div>
</div>
我所期望的是,当我在
框中键入某个内容时,{{data.count}
将每次增加1。然而,代码最初是11,每次我在输入字段中进行更改时,计数都会增加11,有人能帮我找出哪里做错了吗?事先非常感谢。为什么会发生这种情况?
Watcher调用多次,因为您为完整对象数据创建了Watcher
。Flagtrue
将为对象中的每个值创建子观察程序
这是一种正当的行为。我相信你想要的是:
$scope.$watch('data', function(oldValue,newValue) {
if(oldValue.name != newValue.name){
++$scope.data.count;
}
},true);
第二种解决方案是只关注
name
:
$scope.$watch(function(){
return $scope.data.name
}, function(oldValue,newValue) {
++$scope.data.count;
});
这里有另一种方法。使用
ng keydown
指令,仅当在输入元素内按下键时才更新计数
var-app=angular.module('myApp',[]);
app.controller('MyController',函数MyController($scope){
$scope.data={
姓名:“汤姆”,
计数:0
}
});代码>
{{data.count}
Hi Maxim,首先感谢您的回复。您的解决方案正是我想要的。但我仍然对我的代码感到困惑。如果我为完整对象data
创建了一个观察者,那么计数应该增加1,因为我每次只更改data
对象中的name
属性?@User3301对任何对象更改角度触发所有VSLUE的观察者。因此,如果您有更复杂的对象,true
标志将调用更多次。所以,如果你只听名字-将是最好的betHi Naren,谢谢你的解决方案。我是一个角度学习者,如果您能指出我的代码的问题所在,我将不胜感激。@User3301首先,在对象$scope.data
中有一个=
,它使对象在问题的代码中无效,那么您得到11的原因可以在回答中用MW
解释。在此,感谢你们所有人的回答。我的一个朋友指出了我的问题。也就是说,当我观察完整对象时,对象中的元素将有许多子观察者,当名称
更改时,计数
也会增加,但是计数
也是对象中的一个元素,它会反复调用watch,这是一种死锁的情况,$digest最多只能工作10倍,所以它每次增加11倍。
$scope.$watch(function(){
return $scope.data.name
}, function(oldValue,newValue) {
++$scope.data.count;
});