我有一个可扩展/可折叠内容的视图,我希望通过单击表格行来切换.在pre1.0之前,我在模板中有这个:
<tr {{action "expand"}}>
Run Code Online (Sandbox Code Playgroud)
以前根据我的观点处理过:
App.ContentRowView = Em.View.extend({
templateName: 'ember/templates/content/row',
expand: function() {
this.set('isExpanded', !this.get('isExpanded'));
},
isExpanded: false
});
Run Code Online (Sandbox Code Playgroud)
但是,在升级到pre1.0之后,该操作现在由路由器直接进行.这在很多情况下都很有意义,但在这种情况下,扩展实际上是一个视角问题.我试过用一个单击事件处理程序替换它,没有运气.
有关如何使用pre1.0处理这样的视图关注事件的最佳实践吗?
sly*_*7_7 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