$ watch无法识别的更新属性

时间:2014-11-25 16:22:16

标签: javascript angularjs

我有一个指令(让我们称之为B)在另一个指令模板中使用(让我们称之为A),如下所示:

<cr-carousel items="carouselData"></cr-carousel>

carouselData属性是一个对象数组。

在我的指令A的控制器中,我有一个钩子进入我通过carouselData修改Array.prototype.splice.apply的事件:

$scope.$on('carousel.keypress', function (event, data) { ... some logic and branching Array.prototype.splice.apply($scope.carouselData, [someIndex, 0].concat(newItems));

正如您所看到的,我在某个索引处将新的轮播项目插入到轮播中。

轮播本身包含转发器指令:

<li ng-repeat="item in carouselData">

似乎工作正常。将新项目插入轮播会导致新项目出现在HTML末尾的列表中。

我遇到的问题是,在插入新项目时,$watch指令carouselData内的$scope.$watch($attrs.items, function(value) { console.log("The elements for the carousel just changed.", value); });不会触发。{ /强>

splice

我在页面加载时看到该消息显示了几次,但是在插入新项目时我什么都没得到。我已尝试将$timeout代码包裹在$scope.$apply()中,并尝试调用Here happened以查看是否会触发任何内容,以及nadda。

有人能解释一下这里发生了什么吗?

以下是该问题的JSFiddle:http://jsfiddle.net/urdjrqvL/

请注意,$timeout仅在第一次更新值时才会记录到控制台。当$watch中的属性值更新时,项目会显示在HTML中,但{{1}}不会触发。

1 个答案:

答案 0 :(得分:3)

而不是$scope.$watch,在观看数组更改时使用$scope.$watchCollection。如果您使用$watch,则会有第三个参数指定是否要监视值或引用的更改。 Array.splice只更改数组内容,而不是引用,因此简单的监视不会触发。

有关$ watch和$ watchCollection的详细信息,请参阅本页的相应部分 -
https://docs.angularjs.org/api/ng/type/$rootScope.Scope