我有一个指令(让我们称之为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}}不会触发。
答案 0 :(得分:3)
而不是$scope.$watch
,在观看数组更改时使用$scope.$watchCollection
。如果您使用$watch
,则会有第三个参数指定是否要监视值或引用的更改。 Array.splice
只更改数组内容,而不是引用,因此简单的监视不会触发。
有关$ watch和$ watchCollection的详细信息,请参阅本页的相应部分 -
https://docs.angularjs.org/api/ng/type/$rootScope.Scope