在视图中处理动作不是路由器

时间:2012-08-09 16:27:12

标签: ember.js

我有一个可扩展/可折叠内容的视图,我希望能够通过单击表格行来切换。在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处理这样的视图关注事件的最佳实践?

3 个答案:

答案 0 :(得分:20)

弃用答案


即使@ outside2344的答案有效,我认为这也不完全正确。 实际上parentView不代表视图,而是代表其parentView的parentView。 从1.0-pre开始,视图会保留其上下文,因此在模板中,this代表parentView,parentView代表parentView.parentViewview代表当前视图。 这是一个小提琴来说明这一点: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')
    });
})();