1

我的 plunk中,我有一个整数数组,我已将 $scope.$watch 附加到。当我更新数组时,我的 $scope.$watch 不会触发 console.log。为什么我的 console.log 没有被调用?

<!DOCTYPE html>
<html>

  <head>
    <script data-require="angularjs@1.5.0" data-semver="1.5.0" src="https://cdnjs.cloudflare.com/ajax/libs/angular.js/1.5.2/angular.js"></script>
    <link rel="stylesheet" href="style.css" />
    <script src="script.js"></script>
  </head>

  <body ng-app="test" ng-controller="testArray">

    <div ng-repeat="item in MyArray track by $index"> {{item}}</div>
    <button ng-click="add()">testing Add</button>
  </body>

</html>
<script type="text/javascript">
    'use strict';
    var app = angular.module('test', []);

    app.controller('testArray',['$scope',function($scope){

      $scope.MyArray = [1,2,3,4]

      $scope.add = function(){
        $scope.MyArray.push($scope.MyArray.length+1);
      }
    $scope.$watch('MyArray' , function(){
      console.log($scope.MyArray);
    })
    }]);

</script>
4

2 回答 2

4

将您的代码更改为

$scope.$watch('MyArray' , function(){
    console.log($scope.MyArray);
}, true)

查看文档,您将看到第三个参数表明 $watch 方法将使用对象相等性来确定您的数组是否已更改。这意味着angular会使用 angular.equals支持数组比较的方法,例如

于 2016-04-13T20:55:46.027 回答
2

您可以使用,只需在功能中提供选项$watchCollection,它就会比深度观察者便宜。true$watch

$scope.$watchCollection('MyArray' , function(){
    console.log($scope.MyArray);
})

$watchCollection()深入一层并对集合中的顶级项目执行额外的、浅层的引用检查。

如果您有非常大的阵列要监视,那么不要选择$watchtrue深度观察者)。对于1000/2000记录,您会在角度绑定中感到滞后。所以首选的方法是尽可能避免watcher或者只是去$watchCollection

于 2016-04-13T20:56:56.250 回答