8

我正在使用一个复合视图,它的 $.dialog 调用它是 $el。

然后复合视图列出集合中的项目。

现在我尝试了多种方法来呈现集合项:在将其附加到视图之前和之后从复合视图外部获取,在视图内部获取,从我的服务器脚本中预加载集合等...

一切似乎都有效,但出现同样的问题..

一旦复合视图看到这个集合,它就会再次调用它自己的初始化函数......

我完全理解将在集合重置或添加时调用渲染函数......但是初始化???我完全不知道为什么会这样。

showCustomFieldSelect: function(e){

    log('triggered');

    e.preventDefault();

    var cl = new AustApp.Collections.CustomField;

    var select = new AustApp.Views.AvailableCustomFieldsList({
        el: "#available-custom-fields-popup",
        collection: cl
    });

    cl.fetch();


    cl.once("reset", function(){
        // this bind was
        // previously used for creating the view
        // or calling render functions directly
        // amongst numerous efforts to debug

    }, this);


},



MyApp.Views.AvailableCustomFieldsList = function(){

var AvailableCustomFieldsList = Backbone.Marionette.CompositeView.extend({

    template: "#available-contact-list-custom-field-list-js",

    tag: "div",

    itemView: AustApp.Views.AvailableCustomFieldsListItem,

    emptyView: AustApp.Views.EmptyAvailableCustomFieldsListItem,

    itemViewContainer: "ul",

    templateHelpers: viewHelpers,

    initialize: function(){
        log('init called'); // called twice?????
        this.render();
        this.$el.dialog({
            title: "Available Custom Fields",
            width: '600px',
            modal: true,
            dialogClass: "round",
        });
    },
    /* stuff */
});

return AvailableCustomFieldsList;
}();

任何帮助表示感谢,因为我很困惑

4

5 回答 5

18

对我来说,这是固定的(在我把头撞在桌子上几个小时之后),但要确保ItemView!!CompositeView

作品:

MyItemView = Marionette.ItemView.extend({ /* STUFF */ })
MyCompView = Marionette.CompositeView.extend({ itemView: MyItemView })

不起作用(init 调用了两次,没有任何参数):

MyCompView = Marionette.CompositeView.extend({ itemView: MyItemView })
MyItemView = Marionette.ItemView.extend({ /* STUFF */ })

即使我们在声明两者之后获得了 MyCompView 的实例也没关系,itemView 必须在 compsite 视图之前声明。

于 2013-07-09T09:04:39.533 回答
7

所以我将问题缩小到在复合视图之后声明项目视图时,该复合视图也包含在另一个复合视图中。

将嵌套复合视图更改为项目视图解决了问题,但是...

所以将嵌套视图的声明移到集合视图的声明上方修复它......然后改变它发现嵌套复合视图在声明处于正确顺序时起作用。

我认为这应该不那么误导,因为复合视图的双重初始化只是简单的混淆,并且应该吐出关于未定义的 itemview 的错误,而不是如果可能的话 ^_^

谢谢

于 2013-02-25T00:28:47.823 回答
2

谢谢楼上的解释。

我有同样的问题。如果没有使用 Composite 视图定义 itemView,它会在每次其集合更改时调用其初始化函数。

我通过使用一个空视图作为项目视图来解决这个问题。

(我将我的复合视图用于其他目的,并且不需要带有它的项目视图。)

于 2013-05-28T07:34:28.517 回答
2

对于 RequireJS 用户和/或编译(最小化)JavaScript 的用户

我想补充一点,当丑化(最小化)你的 JavaScript 时,丑化引擎可能会乱序声明(即 CompositeView 和 ItemView 可能会像@Thomas Hudspith-Tatham 和 @simbolo 提到的那样以相反的顺序声明)。当使用 requireJS 模块化 Backbone.Marionette 并优化(编译)代码时,问题更为常见。

不幸的是,除了重新编译代码之外,我不知道对我有用的有保证的修复。

于 2014-06-12T14:29:11.480 回答
1

我在分享我的经验。它可能对某人有所帮助。

我遇到了类似的问题。在 Initial 时,我认为事件被触发了两次,但实际上,它被监听了两次,这导致了异常的应用程序行为。

我的事件从复合视图(一个触发器)触发了一次,但由于 Contact 控制器的两个实例而被监听了两次(2 on)。

我通过确保我只有一个特定行为的侦听器(一个控制器实例)来修复(在我的情况下打开一个编辑对话框)。

笔记 。我的应用程序中有多个控制器,我正在使用 require 加载。

于 2014-01-12T07:16:20.030 回答