【发布时间】:2026-01-14 23:15:03
【问题描述】:
我制定了一个新指令,它基本上是一个新的轮播,它扩展了 Angular UI 轮播引导程序。这个新的轮播将在一帧中显示多个 div。我的新指令接受数组中的任何数据以及每个数据的自定义 html 模板。
但是,如果我将轮播与指令一起使用,我会在指令中使用 watch 看到一种奇怪的行为。一切正常,但我指令中的手表总是为newVal 和oldVal 获得相同的值。我的意思是,这是我的轮播代码:
<slide ng-repeat="frame in ctrl.frames">
<div ng-repeat="divs in frame.divs">
<custom-directive data="divs"></custom-directive>
</div>
</slide>
在我的customDirective 控制器中,我观察到这样的数据变化:
$scope.$watch("ctrl.data", function(newVal, oldVal){
if (newVal !== oldVal) {
// data is updated, redraw the directive in my case
// however newVal is always the same as oldVal
}
})
newVal 和 oldVal 始终相同。我预计初始状态为 oldVal = undefined 和 newVal 将是我的新数据。然而,情况并非如此。数据作为双向绑定传递给 carousel 和自定义指令(在每个指令的范围内使用 '=' 运算符)。
为什么会发生这种情况?我已经调查了很长时间,以下是我的发现:
- 如果我不使用
ng-repeat在我的轮播中,这会起作用。oldVal将是undefined和newVal将是我在初始状态下的数据。但是为什么 ng-repeat 会导致这种情况呢?我读过很多关于原型继承的黄金法则的文章,说ng-repeat会创建新的childScope来隐藏/隐藏父级,但这只会发生在原始对象,我正在将一个数组传递给我的数据。
我需要在我的轮播指令中使用 ng-repeat.. 所以我需要知道为什么 ng-repeat 会导致这个.. 有什么建议吗?
更新: 在 Plunkr here 中重现了该问题。如您所见,oldValue 始终与 newValue 相同(我希望 oldValue 一开始是未定义的)
【问题讨论】:
-
你确定这个函数真的被调用了吗?还是只是它从未进入您的
if (newVal !== oldVal)代码? (最初除外) -
此外,还不清楚
ctrl.data与html 中ng-repeats 中的数据有何关系。ctrl.data到底在哪里使用?这可能有助于找出任何范围/结构问题 -
@brettvd 是的,这个函数正在被调用。我很确定,因为当我调试时,正在调用 watch 但 newVal 始终与 oldVal 相同
-
@brettvd 所以在我的自定义指令中,我将“divs”传递给数据。此数据绑定到自定义指令控制器到 ctrl.data...
-
每次数据更改时都会触发吗? newVal/oldVal 是否匹配之前或之后的数据状态?您是否尝试过在 Plunkr 或 JSFidde 等更简单的代码中复制它?
标签: javascript angularjs carousel angular-ui-bootstrap