1

在导航到特定 URL 时,会触发一个控制器方法,它将 ItemView 加载到我的应用程序的一个区域中。这个 ItemView 本身(父级)将包含一些子 ItemView,当它自己渲染时将它们全部渲染。这是父项视图:

return Backbone.Marionette.ItemView.extend({
    template: Handlebars.compile(template),
    ui: {
        textInput01: "#text-input-01"
    },
    events: {
        // no events yet
    },
    initialize: function() {
        // no init yet
    },
    onRender: function() {
        this.appRoutefinderTextinputItemView = new AppRoutefinderTextinputItemView({parentView: this});

        $(this.ui.textInput01).html(this.appRoutefinderTextinputItemView.render());
    }
});

这是当前唯一的 ItemView:

return Backbone.Marionette.ItemView.extend({
    template: Handlebars.compile(template),
    events: {
        // no events yet
    },
    initialize: function() {
        // no init yet
    },
    onRender: function() {
        // no onRender yet
    }
});

出于某种原因,我无法理解,尽管子级上的initializeonRender方法都在触发,并且所有必要的数据似乎都存在,但子级要么没有被渲染,要么以“空白”方式渲染,导致父级不变看法。

据我了解,我不需要调用render()孩子,因为它在实例化/引用 ItemView 时暗示?即使我挂断render()电话,也会得到相同的结果。

我必须假设有一些关于从我刚刚丢失的其他 ItemViews 中渲染 ItemViews 的东西,但是通过文档搜索似乎没有帮助。

第二个问题是:我是否以正确的方式实例化子视图,或者有更好的方法吗?

*编辑 - 所以经过一些试验,似乎“接受”的解决方案只是让父视图成为一个布局,它是一个扩展的 ItemView。这确实有效。但是,我仍然想知道为什么 ItemView 中的 ItemView 不起作用。我是否打算在 ItemView 上集成一个手写render()方法,我是否要保持这种方式?

4

1 回答 1

3

您的原始代码的问题是这一行:

$(this.ui.textInput01).html(this.appRoutefinderTextinputItemView.render());

主干视图的render方法不返回呈现的 HTML。此方法执行渲染并更新el视图。此方法的返回值是视图本身。Marionette 不会改变这种行为。

您需要更改代码以使用视图的el. 另请注意,这this.ui.textInput01已经是一个 jQuery 选定对象,因此您不需要再次包装它。


this.appRoutefinderTextinputItemView.render();
this.ui.textInput01.html(this.appRoutefinderTextinputItemView.el);
于 2012-10-23T14:19:37.460 回答