0

Aaaargh 我已经找到了解决方案...滚动到底部查看。

我遇到了 Backbone Marionette 的问题,我似乎无法找到解决方案。

我已经构建了一个嵌套视图结构来显示一个手风琴视图,就像在 Twitter Bootstrap 中使用的那样,它由一个外部 CompositeView(Accordion 外部)组成,它的 ItemView 设置为另一个 CompositeView(Accordion 组),而后者又将其 ItemView 设置为ItemView(手风琴组项目)。它显示和运行良好。这是源代码的简化副本(我在应用程序的其他地方有一个抽象的手风琴视图,但这只是为了了解结构):

外手风琴:

    // Marionette CompositeView 
    Accordion.View = app.Common.View.Component.Accordion.View.extend({
        tagName : 'div',
        className : 'accordion',
        itemViewContainer : 'div.accordion-groups',
        template: '#accordion_template',
        itemView : Accordion.ViewGroup,
        emptyView : Accordion.ViewEmpty
    });

每个手风琴组显示的视图:

    // Marionette CompositeView 
    Accordion.ViewGroup = app.Common.View.Component.Accordion.ViewGroup.extend({
        tagName : 'div',
        className : 'accordion-group',
        itemViewContainer : 'ul',
        template: '#accordion_template_group',
        itemView : Accordion.ViewGroupItem,
        emptyView : Accordion.ViewGroupEmpty
    });

    // Marionette ItemView  
    Accordion.ViewEmpty = app.Common.View.Component.Accordion.ViewEmpty.extend({
        template: '#accordion_template_empty'
    });

要在组内显示的项目:

    // Marionette ItemView  
    Accordion.ViewGroupItem = app.Common.View.Component.Accordion.ViewGroupItem.extend({
        triggers : {
            'mouseover' : 'mouseover'
        },
        template: '#accordion_template_group_item',
        tagName : 'li'
    });

    // Marionette ItemView  
    Accordion.ViewGroupEmpty = app.Common.View.Component.Accordion.ViewGroupEmpty.extend({
        template: '#accordion_template_group_empty',
        tagName : 'li'
    });

将鼠标悬停在组中的手风琴项上,会导致在最低级别触发名为mouseover的触发器,在中间的 CompositeView 中触发itemview :mouseover,在外部 CompositeView 上触发 itemview:itemview:mouseover。这些并不是特别描述正在发生的事情,所以我想更改触发器名称。对我来说,这看起来很简单,但我就是无法正确完成它,而且我觉得我忽略了一些东西。

我想要实现的是以下。当在嵌套最深的 ItemView 中触发事件时,例如如上所示的“mouseover”,我希望最外部的 CompositeView 触发一个触发器,例如名为group:item:mousover的模型作为数据。在这种情况下,如果我将手风琴视图嵌套在另一个视图下,它将具有更重要的名称。

希望你们中的任何人都可以提供帮助。谢谢!

--

目前解决方案:

    Accordion.View = app.Common.View.Component.Accordion.View.extend({
        tagName : 'div',
        className : 'accordion',
        itemViewContainer : 'div.accordion-groups',
        template: 'common/view/entitycomponent/set/accordion/accordion_template',
        itemView : Accordion.ViewGroup,
        emptyView : Accordion.ViewEmpty,

        // I've added the following
        onCompositeRendered : function() {
            this.on('itemview:itemview:mouseover',function(view) {
                this.trigger('group:item:mouseover',view);
            });
        }
    });
4

1 回答 1

0

你基本上有2个选择:

于 2013-08-27T09:41:44.947 回答