0

我的问题很可能需要一个非常简单的答案,然而,我无法轻易找到。

我正在处理的一个 Backbone 应用程序有几个视图。在定义不同的视图时,我在初始化函数中使用 _.bindAll 将“this”视图对象与视图的渲染函数连接起来。例如:

DiscussedItemView = Backbone.View.extend({
    ...
        initialize: function() {
            _.bindAll(this, "render");
        },


        render: function() {    

            this.$el.attr('id', 'li-meeting-task-' + this.model.getId());

            this.$el.html(JST['tasks_sandbox/agenda_task_item']({ 
                taskName    : this.model.getName(),
                taskId      : this.model.getId()
            }));

            return this;
        },
    ...
});

要创建 DiscusedItemView 的新实例,我执行以下操作:

...
        var discussion_agenda_row = new DiscussedItemView({model: task});
        discussion_agenda_row.render();
        this.$( '#meeting-items-list' ).append(discussion_agenda_row.$el); 
...

代码工作正常。尽管如此,我还是不明白为什么需要在讨论议程上显式使用 render() 函数。我以为初始化一个新的 DiscusedItemView 实例会自动调用渲染函数,但是如果我删除该discussion_agenda_row.render();行,则不会显示 HTML。我错在哪里?

谢谢你,亚历山德拉

4

2 回答 2

2

不,render不会被 自动调用initialize。应用程序中的其他组件(例如路由器或其他视图)将告诉您的视图何时呈现自己。

于 2012-05-21T18:22:16.033 回答
1

视图响应模型中的变化。在您的代码中,您没有对模型进行更改,因此视图没有响应。您还没有将视图设置为模型更改的侦听器。你可以在你的初始化中做的是这样的:

initialize : function() {
    //this will tell the view to render when the model 
    //triggers a "change" event
    this.model.on("change", this.render, this);

    //this will make the model throw the change event
    //and since the view is listening to "change," render will be invoked.
    this.model.fetch();
}

综上所述,如果您不进行任何获取并且数据就在您的模型中,您仍然必须显式调用 view.render()。无论如何,对于好的 MVC,我仍然会让视图监听模型中的变化,以便它会正确地更新自己作为响应。

于 2012-05-21T18:28:51.433 回答