Angularjs 使用 ControllerAs 时观察 Array 的输入绑定变化

Angularjs watch input binding change for Array when using ControllerAs

我有一个 AngularJs 组件绑定到英雄,它是一个数组。如何观察这个输入的数组变化?我尝试了 $scope.watch("heroes", ...)$onChanges,但到目前为止没有成功。

bindings: {
    heroes: '<',
}

这是我的笨蛋:https://plnkr.co/edit/J8xeqEQftGq3ULazk8mS?p=preview

出现这个问题是因为默认情况下 $scope.$watch 没有深入观察对象。这意味着因为你从来没有 destroy/recreate 你的数组,引用并没有真正改变因此 $scope.$watch 没有看到任何变化。如果您观看 heroes.length,该原语会发生变化,并且您的 $scope.$watch 会触发相应的监听功能。通过将 $scope.$watchtrue 选项一起使用,您告诉 angular 引擎深入监视所有属性。 这对于大对象来说是非常密集的,因为 $scope.$watch 使用 angular.copy 来跟踪变化

如果你要使用 $scope.$watchCollection angular 会创建一个浅拷贝并且会占用更少的内存。所以我觉得你的 3 个主要选项是

观看 heroes.length ,添加 true 或使用 $watchCollection

我觉得使用 heroes.length 是最好的选择,所以代码看起来像

$scope.$watch('heroes.length',function(){});

其他两个选项如下所述

$scope.$watch('heroes',function(){ //do somthing },true)

$scope.$watchCollection

使用 watchCollection 的好处是,它需要更少的内存来深入观察对象。

Shallow watches the properties of an object and fires whenever any of the properties change (for arrays, this implies watching the array items; for object maps, this implies watching the properties). If a change is detected, the listener callback is fired.

The obj collection is observed via standard $watch operation and is examined on every call to $digest() to see if any items have been added, removed, or moved. The listener is called whenever anything within the obj has changed. Examples include adding, removing, and moving items belonging to an object or array.

ControllerAs 结构需要特殊的监视表达式,因为属性不在 $scope 中。

//This one works and is the best one (> AngularJs 1.5)
$scope.$watch("$ctrl.heroes.length", function () {
  console.log("ControllerAs syntax"); // Triggers once on init
});

//This one works as well
var ctrl = this;
$scope.$watch(() => {
  return ctrl.heroes.length;
}, (value) => {
  console.log("complex watch"); // Triggers once on init
});

参见此处示例:https://plnkr.co/edit/J8xeqEQftGq3ULazk8mS?p=preview