如何使用Backbone和Marionette在Handlebars模板中获取模型后更新数据?

时间:2013-12-09 17:16:35

标签: backbone.js handlebars.js marionette

在获取分配给Marionette CompositeView的模型后,尝试在Handlebars模板更新中创建数据字段,但页面中的HTML未更新。

我的代码如下所示:

型号:

B.Page.Model = Backbone.Model.extend({
    url: function () {
        return 'my/resource/';
    },
});


查看:

B.Page.CompositeView = Backbone.Marionette.CompositeView.extend({
    template: Handlebars.compile(templates.find('#my-template').html()),

    initialize: function(options) {
        _.bindAll(this);
        this.model.fetch();
    },
)};


模板:

<script id="my-template" type="text/x-handlebars-template">
    Date: <span id="my-data-field">{{data}}</span>
</script>

我检查了资源,它确实返回了data字段集的正确JSON。此外,模型将传递到视图中。

我怀疑这是因为在检索到数据后没有调用render函数;但是,我希望得到关于应该如何完成的反馈。

这样做的好方法是什么?

谢谢!

编辑:这个CompositeView确实有一个与之关联的Collection(当我触发相应的事件时渲染就好了)。我故意遗漏了部分代码,以避免混淆问题。

2 个答案:

答案 0 :(得分:3)

你是对的,因为CompositeViewCollectionView延伸,它默认只对集合事件重新渲染。要让它在模型上的更改中重新渲染,您可以在CompositeView中执行以下操作:

initialize: function(){
    this.listenTo(this.model, "change", this.render);
}

答案 1 :(得分:1)

所有Marionette视图都有一个与传入模型绑定的modelEvents对象。所以你可以通过以下方式轻轻地清理接受的答案:

template: Handlebars.compile(templates.find('#my-template').html()),

modelEvents: {
    'change': 'render'
}

而不是在初始化时手动绑定。