【问题标题】:AngularJS $watch not working properlyAngularJS $watch 无法正常工作
【发布时间】:2017-10-02 09:55:32
【问题描述】:

最近我在学习 Angularjs,我的代码似乎没有按预期工作: 这是我的div

<div ng-app="myApp">
<div ng-controller="myController">
<input type="text" ng-model="data.name" value=""/>
{{data.count}}
</div>
</div>

我的controller 是:

<script>
var app = angular.module('myApp',[]);
app.controller('myController', function($scope) {

    $scope.data = {
        name:"tom",
        count = 0
    }

    $scope.$watch('data', function(oldValue,newValue) {
        ++$scope.data.count;
    },true);

})
</script>

我期望的是,当我在 &lt;input&gt; 框中输入内容时,{{data.count}} 每次都会增加 1。但是代码最初是 11,每次我在输入字段中进行更改时,计数都会增加 11,有人可以帮我找出哪里做错了吗?提前非常感谢。

【问题讨论】:

  • 感谢大家的回答。我的一位朋友指出了我的问题。也就是说,当我观察完整的对象时,对象中的元素会有很多子观察者,当name改变时,count也会增加,但是count也是一个元素它将一次又一次调用 watch 的对象,这是一种死锁情况,$digest 最多只能工作 10 次,所以这就是为什么它每次增加 11。

标签: angularjs


【解决方案1】:

为什么会这样?

Watcher 调用多次,因为您为完整对象 data 创建了 watcher。标记 true 将为对象中的每个值创建 sub-watcher

这是一种正确的行为。我相信你想要这样的东西:

$scope.$watch('data', function(oldValue,newValue) {
         if(oldValue.name != newValue.name){
             ++$scope.data.count;
          }

    },true);

Demo Fiddle


第二种解决方案是仅在name 上观看:

$scope.$watch(function(){
  return $scope.data.name
  }, function(oldValue,newValue) {
      ++$scope.data.count;
});

【讨论】:

  • 您好 Maxim,首先感谢您的回复。您的解决方案正是我想要的。但我仍然对我的代码感到困惑。如果我为完整对象 data 创建一个观察者,那么计数应该增加 1,因为我每次只更改 data 对象中的 name 属性?
  • @User3301 在任何对象更改角度触发所有 vslues 的观察者。所以如果你有更复杂的对象,true 标志会调用更多次。所以如果你只听名字 - 最好的选择
【解决方案2】:

这是另一种方法。使用ng-keydown 指令并仅在输入元素内按下键时更新计数。

var app = angular.module('myApp', []);
app.controller('MyController', function MyController($scope) {
  $scope.data = {
    name: "tom",
    count: 0
  }
});
<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.2.23/angular.min.js"></script>
<div ng-controller='MyController' ng-app='myApp'>
  <input type="text" ng-model="data.name" value="" ng-keydown="data.count = data.count+1" /> {{data.count}}
</div>

【讨论】:

  • 嗨,Naren,感谢您的解决方案。我是 Angular 学习者,所以如果您能指出我的代码问题出在哪里,我将不胜感激。
  • @User3301 首先在对象$scope.data 中有一个=,这使得问题代码中的对象无效,那么你得到11的原因可以在答案中解释为MW。在这个link
猜你喜欢
  • 2016-09-06
  • 2014-05-06
  • 1970-01-01
  • 2022-08-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多