【发布时间】:2013-03-01 18:38:08
【问题描述】:
这是fiddle for this question(确保您已打开控制台):
基本上,我有一个把手块视图作为父级,然后循环遍历一组项目并为每个项目创建子块视图。后来,那些孩子被某种方式修改了,我想检测并处理那个事件。
摘要代码:
{{#view App.outerView}}
{{#each item in items}}
<h6>Person:</h6>
{{#view App.innerView}}
<dl>
<dt>First Name</dt><dd>{{item.first}}</dd>
<dt>Last Name</dt><dd>{{item.last}}</dd>
</dl>
{{/view}}
{{/each}}
{{/view}}
稍后:
controller.get( 'items' ).pushObject( 'new item' );
在 jsFiddle 中,我试图保持最后一个子对象始终突出显示(活动 = true)。当最初插入 outerView 时,我们将高亮应用到最后一项,它按预期工作。稍后,当我们添加一个新项目时,我们的 highlight 方法会触发,但它看不到新项目。
关于这个的2个问题:
主要问题:为什么最后一项 (Matt) 没有突出显示?换句话说,为什么在添加新项目后,
childViews.length仍然报告旧值?有没有更好的方法来做到这一点?次要问题:为什么我们添加新项目时
childViews上的观察者会触发两次? (总共 3 次:初始插入 1 次,添加 1 个新子项时 2 次)
编辑:我稍微调整了小提琴以更好地说明我的需求。注意outerView(HTML + innerViews)的混合内容。基本上,我的 outerView 需要接受任何内容作为子项,而不仅仅是视图/数据的数组/集合。
编辑 2:进一步澄清:事后操作这些子视图是另一回事,可以通过使用 childViews(余烬视图)的内容或使用 jQuery 来操作来完成可能不是正式的 ember 视图对象或任何其他方式的 HTML 元素。 这里的真正目标只是在任何 outerView 内容发生变化时捕获事件(使用 childViews 的当前副本)。
编辑 3:这是Issue on Github
【问题讨论】:
-
奇怪的是外部视图没有更新它的 childViews 。您可以使用 CollectionView 完成您现在拥有的工作,但这可能无法达到您的目的?这是这种方式的小提琴jsfiddle.net/3Up2M
-
@geekingreen 感谢这个小提琴。它显示了我所期望的工作方式。但是,在这种特殊情况下,我需要能够使用块视图而不是数组绑定。不确定是否有办法让您的示例以这种方式工作。
-
我认为你做错了...你尝试使用 ContainerView 了吗???
-
可能发生的情况是 childViews 实际上是中间虚拟视图的子项,而您看到的是 childViews 数组的陈旧副本,因为它们实际上不是您的 childViews。问题是为什么观察者会开火呢?嗯。
-
如果你在 foobar 观察者中放置一个断点,并检查 this._childViews 中的实际 childView,你可以看到 this._childViews[0]._childViews 包含了新创建的尚未渲染的名称,但是这个._childViews[0].childViews 没有。然而,后者应该影响您的 outerView 的 childViews 属性,而不是前者。好奇。
标签: javascript model-view-controller ember.js javascript-framework