7

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

4

3 回答 3

20

已弃用的答案


即使@outside2344 的答案有效,我认为它也不完全正确。IndeedparentView不代表视图,而是其 parentView 的 parentView。从 1.0-pre 开始,视图保留了它们的上下文,因此在模板中,this代表 parentView,parentView代表parentView.parentViewview代表当前视图。这是一个小提琴来说明这一点:http: //jsfiddle.net/Sly7/cnmJa/

对我来说答案是{{action expand target="view"}}

编辑(回复@Gal Ben-Haim)

动作助手在基于路由器的应用程序中的行为几乎没有什么不同。从文档中引用:

在路由器驱动的应用程序中,如果一个动作没有被视图拦截,该事件将冒泡到渲染该视图的路由。如果该 Route 是另一个 Route 的子路由,则将在那里一直查找到顶级 Route 定义,即我们的 über-container: root。

这种冒泡效果允许某些操作保持私密。如果某些转换应该仅适用于某些子子状态,请将转换放在子状态上,您就已经实现了一种范围界定。

基本上,对我来说,这意味着在路由器驱动的应用程序中,如果您没有在动作助手中明确定义目标,它将被发送到路由器。


更新的答案

我认为现在指南很好地回答了这个问题。见http://emberjs.com/guides/templates/actions/#toc_specifying-a-target

于 2012-08-09T18:45:04.053 回答
1

在 pre1.0 中,您可以通过将 target="parentView" 添加到操作来使视图字段成为操作:

{{action "expand" target="parentView"}}
于 2012-08-09T16:30:54.397 回答
1

默认情况下,事件不会通过视图层次结构冒泡。你可以改变它(虽然我不能说我会推荐它):

(function() {
    Ember.View.reopen({
        // Let actions bubble to parentView by default.
        target: function() {
            return this.get('parentView');
        }.property('parentView')
    });
})();
于 2013-09-23T14:57:11.667 回答