【问题标题】:AngularJS $watch is failing for arrays after 1st update第一次更新后,AngularJS $watch 数组失败
【发布时间】:2013-10-03 00:04:37
【问题描述】:

我需要跟踪作为数组的模型值何时被指令更新但 $watch 似乎失败了。我创建了一个小提琴来说明问题:

http://jsfiddle.net/DsTLN/

我设置了一个手表,以便在模型更改时执行操作。

$scope.$watch('model.title', function(newValue, oldValue) {
  if ($scope.model) {
      console.debug("watchedTitle=" + newValue);
      $scope.watchedTitle = newValue ;            
  }});

如果模型 newValue 是整数,则 $watch 会如调试日志所示持续触发:

watchedTitle=1 
watchedTitle=2 
watchedTitle=3 
watchedTitle=4 
watchedTitle=5 

我设置了第二个手表来监控数组的变化:

$scope.$watch('model.titlearray', function(newValue, oldValue) {

如果 newValue 是一个数组 $watch 只在第一次使用时触发:

watchedTitlearray: 1 

之后我的第二只手表就没有开火了。

知道我做错了什么吗?

【问题讨论】:

    标签: angularjs angularjs-directive angularjs-scope


    【解决方案1】:

    为了观察列表中元素的变化,将$watch的第三个参数设置为true

    $scope.$watch('model.titlearray', function(newValue, oldValue) {
        // ...
    }, true);  
    

    【讨论】:

      【解决方案2】:

      在 Angular 1.2 中,您应该使用:

      $scope.$watchCollection('model.titlearray', function(newValue, oldValue) {
          // ...
      });
      

      http://docs.angularjs.org/api/ng.$rootScope.Scope

      【讨论】:

        【解决方案3】:

        正如sza所说,你需要将$watch的第三个参数设置为true。这样您就可以比较两个对象的相等性,而不是通过引用,如 angular scope docs

        中所述
        $watch(watchExpression, listener, objectEquality)
        
        • objectEquality(可选) - 布尔值 - 比较对象是否相等而不是参考。

        我修复了你的 jsfiddle,让它按照你想要的方式工作,这里是链接:http://jsfiddle.net/r4zce/

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2019-01-31
          • 1970-01-01
          • 2011-05-21
          • 1970-01-01
          • 2017-01-04
          相关资源
          最近更新 更多