我有一个可扩展/可折叠内容的视图,我希望能够通过单击表格行来切换。在pre1.0之前,我在模板中有这个:
<tr {{action "expand"}}>
以前是根据我的观点处理的:
App.ContentRowView = Em.View.extend({
templateName: 'ember/templates/content/row',
expand: function() {
this.set('isExpanded', !this.get('isExpanded'));
},
isExpanded: false
});
但是,在升级到pre1.0之后,该操作现在由路由器直接进行。这在很多情况下都很有意义,但在这种情况下,扩展实际上是一个视角问题。我试过用一个点击事件处理程序替换它,但没有运气。
是否有关于如何使用pre1.0处理这样的视图关注事件的最佳实践?
答案 0 :(得分:20)
弃用答案
即使@ outside2344的答案有效,我认为这也不完全正确。
实际上parentView
不代表视图,而是代表其parentView的parentView。
从1.0-pre开始,视图会保留其上下文,因此在模板中,this
代表parentView,parentView
代表parentView.parentView
,view
代表当前视图。
这是一个小提琴来说明这一点:http://jsfiddle.net/Sly7/cnmJa/
对我来说,答案是{{action expand target="view"}}
编辑(回答@Gal Ben-Haim)
基于路由器的应用程序中的动作帮助程序行为略有不同。从文档中引用:
在路由器驱动的应用程序中,如果某个操作未被视图拦截,则该事件将冒泡到呈现该视图的路径。如果该路线是另一条路线的子路线,那么将在那里一直寻找过渡到顶层路线定义,即我们的超级容器:根。
此冒泡效果允许某些操作保持私密。如果某些转换仅适用于某些子子状态,则将转换置于子状态,并且您已实现了某种类型的范围。
基本上,对于我来说,这意味着在路由器驱动的应用程序中,如果您没有在动作助手中明确定义目标,则会将其发送到路由器。
更新回答
我认为现在指南很好地回答了这个问题。见http://emberjs.com/guides/templates/actions/#toc_specifying-a-target
答案 1 :(得分:1)
在pre1.0中,您可以通过向操作添加target =“parentView”来使视图字段成为操作:
{{action "expand" target="parentView"}}
答案 2 :(得分:1)
默认情况下,事件不会在视图层次结构中冒泡。你可以改变这个(虽然我不能说我推荐它):
(function() {
Ember.View.reopen({
// Let actions bubble to parentView by default.
target: function() {
return this.get('parentView');
}.property('parentView')
});
})();