骨干木偶,复合视图初始化两次(Backbone Marionette, Composite View

2019-08-17 03:08发布

我使用的是已$ .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;
}();

任何帮助赞赏,因为我狼狈

Answer 1:

对我来说,这是固定的,但在确认(几个小时敲打我的表头之后) 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的实例都被宣布后,前compsite视图是ItemView控件必须申报。



Answer 2:

所以我已经收窄的问题时,该项目视图,其还包含另一种复合视图中的复合视图后宣布。

改变嵌套复合视图到项目视图解决了问题,但后来......改变嵌套复合视图到一个集合视图口角错误的ItemView控件为集合不可用

所以移动固定它集合视图的声明之上嵌套视图的声明......然后改变它报这嵌套的复合意见工作时, 声明是正确的顺序

我想这应该是少误导,因为复合视图的双初始化,只是普通的混乱,应该吐出一个错误关于未定义ItemView控件来代替,如果在所有可能的德里克^ _ ^

谢谢



Answer 3:

感谢您的上述解释。

我有同样的问题。 如果没有与复合视图定义ItemView控件,它调用它的初始化函数,每次其收藏的变化。

我通过使用空视图项目视图固定这一点。

(我是用我复合视图用于其他目的,并没有要求查看项目的吧。)



Answer 4:

对于RequireJS用户和/或用户编译(Minizing)的JavaScript

我想补充一点,uglfying时(减少)你的JavaScript中,uglifying引擎可以宣告出来的东西顺序(即CompositeView中和ItemView控件可以像@Thomas Hudspith,泰胜相反的顺序进行声明和@simbolo提到)。 模块化当requireJS你Backbone.Marionette和优化(编译)的代码的问题是比较常见的。

不幸的是,我不知道存在保证修复,除非重新编译代码,已经为我工作。



Answer 5:

我分享我的经验。 这可能有助于一些之一。

我面临着类似的问题。 在最初我以为事件被解雇了两次,但在现实中,被侦听两次导致异常的应用程序行为。

我的活动是由复合视图(一个触发器)被触发一次,但由于被收听两次(2)来联系控制器的两个实例。

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

注意 。 我在我的应用程序的多个控制器和我使用需要加载。



文章来源: Backbone Marionette, Composite View initializes twice