Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/angularjs/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
AngularJS$手表工作不正常_Angularjs - Fatal编程技术网

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。然而

最近我正在学习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。然而,代码最初是11,每次我在输入字段中进行更改时,计数都会增加11,有人能帮我找出哪里做错了吗?事先非常感谢。

为什么会发生这种情况? Watcher调用多次,因为您为完整对象
数据创建了Watcher
。Flag
true
将为对象中的每个值创建子观察程序

这是一种正当的行为。我相信你想要的是:

$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;
});