首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >Backbone Marionette,复合视图初始化两次

Backbone Marionette,复合视图初始化两次
EN

Stack Overflow用户
提问于 2013-02-22 13:30:03
回答 5查看 3.8K关注 0票数 8

我使用了一个复合视图,该视图在其$el上调用了$.dialog。

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

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

一切似乎都很正常,但同样的问题也出现了。

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

代码语言:javascript
代码运行次数:0
运行
复制
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;
}();

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

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2013-02-25 08:28:48

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

将嵌套复合视图更改为集合视图避免了集合的itemView不可用的错误

因此,将嵌套视图的声明移动到集合视图的声明之上可以修复它……然后更改后发现,当声明以正确的顺序时,嵌套的复合视图才能工作。

我认为这应该会减少误导性,因为复合视图的双重初始化只会让人感到困惑,并且应该会显示一个关于未定义的项目视图的错误,而不是所有可能的derick ^_^

谢谢

票数 7
EN

Stack Overflow用户

发布于 2013-07-09 17:04:40

对我来说,这已经解决了(在我的头撞了几个小时的桌子之后),但要确保ItemView是在CompositeView之前声明的!

工作:

代码语言:javascript
代码运行次数:0
运行
复制
MyItemView = Marionette.ItemView.extend({ /* STUFF */ })
MyCompView = Marionette.CompositeView.extend({ itemView: MyItemView })

不支持(不带任何参数调用两次init):

代码语言:javascript
代码运行次数:0
运行
复制
MyCompView = Marionette.CompositeView.extend({ itemView: MyItemView })
MyItemView = Marionette.ItemView.extend({ /* STUFF */ })

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

票数 18
EN

Stack Overflow用户

发布于 2013-05-28 15:34:29

感谢上面的解释。

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

我通过使用一个空的视图作为项目视图修复了这个问题。

(我将组合视图用于其他目的,并不需要与其配合使用项目视图。)

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/15017504

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档