我试图弄清楚为什么$watch没有触发我。这是相关控制器的片段:
$watch
$scope.$watch('tasks', function (newValue, oldValue) { //do some stuff //only enters here once //newValue and oldValue are equal at that point }); $scope.tasks = tasksService.tasks(); $scope.addTask = function (taskCreationString) { tasksService.addTask(taskCreationString);//modifies tasks array };
在我看来,tasks显然是正确更新的,因为我的长度范围是这样的:
tasks
<span>There are {{tasks.length}} total tasks</span>
我想念什么?
尝试$watch('tasks.length', ...)或$watch('tasks', function(...) { ... }, true)。
$watch('tasks.length', ...)
$watch('tasks', function(...) { ... }, true)
默认情况下,$ watch不检查对象是否相等,而仅作为参考。因此,$watch('tasks', ...)将总是简单地返回相同的数组引用,并且不会改变。
$watch('tasks', ...)
更新: Angular v1.1.4添加了一个$ watchCollection()方法来处理这种情况:
Shallow监视对象的属性,并在任何属性更改时触发(对于数组,这意味着监视数组项,对于对象映射,这意味着监视属性)。如果检测到更改,listener则触发回调。
listener