在Marionette ItemView中onRender期间将模型参数传递给车把模板

时间:2014-09-17 05:18:24

标签: backbone.js handlebars.js marionette

我有一个像

这样的把手模板
<select accesskey="z" class="timezone">
    {{#each timezones}}
    <option value="{{@key}}">{{this}}</option>
    {{/each}}
</select>

和Marionette.ItemView的相应部分一样:

var TimeView = Backbone.Marionette.ItemView.extend({
    template : TimeTemplate ,
    className : 'time-selector-extra',
    onRender: function(){
        var context = this.model.toJSON();
        context.isnew = this.model.isNew();
        context.timezones = JSON.parse(Timezones.timezonesList);
    }
    .
    .
});

我现在需要的是,只要获得所有时区列表的值,就会在onRender期间填充模板中的选项字段。

1 个答案:

答案 0 :(得分:1)

您可以使用serializeData View方法使用来自当前模型以外的其他来源的数据填充模板。

var TimeView = Backbone.Marionette.ItemView.extend({
    template : TimeTemplate ,
    className : 'time-selector-extra',
    serializeData: function(){
        var context = this.model.toJSON();
        context.isnew = this.model.isNew();
        context.timezones = JSON.parse(Timezones.timezonesList);
        return context;
    }
    .
    .
});

由于此方法会覆盖默认序列化(仅return this.model.toJSON()),因此请确保返回对象以按需填充模板。

如果在呈现视图时时区数据不可用,则可以在时区对象上listenTo一个事件,以便在数据可用时重新呈现视图。

var TimeView = Backbone.Marionette.ItemView.extend({
    initialize: function(){
            this.listenTo(Timezones, 'change', this.render)

    },
    ...
})

(我假设Timezones是Backbone.Model的一个实例,会触发change事件)