4

当模板中显示的数据是国际化文本或模型属性时,渲染模板是小菜一碟,但是当在一个模板中同时渲染这两者时,我似乎找不到一个干净的解决方案。

作为参考,我通过 Require.js 的 i18n 插件使用 i18n。

假设我有一个简单的模板:

<h3>{{displayText.load}} #{{id}}</h3>

<h4 id="loading-load-data">{{displayText.loadingLoadData}}...</h4>

displayText对象代表 i18n 文本,而项目id代表 Backbone 模型属性。

在视图上使用 Backbone 的template属性,我可以执行以下操作以使用 i18n 文本呈现模板,但没有模型属性数据:

return Backbone.Marionette.ItemView.extend({
    template: function () {
        var compiledTemplate = Handlebars.compileClean(template);

        // localizedText represents the i18n localization object, using the Require.js i18n plugin
        return compiledTemplate(localizedText);
    },
    // some more View properties and methods
});

但是,一旦我还想显示模型数据,这将不再有效,主要是因为this在模板属性中未定义(所以我无法引用this.model.attributes),而且似乎我不得不退回到覆盖该render()方法,通过模板的 i18n 对象和模型属性,如下所示:

return Backbone.Marionette.ItemView.extend({
    template: Handlebars.compileClean(template),
    render: function() {
        var templateParams = _.extend({}, this.model.attributes, localizedText),
            renderedTemplate = this.template(templateParams);

        this.$el.html(renderedTemplate);

        this.bindUIElements();
        this.delegateEvents();

        return this;
    }
});

我真的很想保留 Marionette 的默认处理方式render(),只使用模板属性来呈现 i18n 文本和模型数据。这可能吗?

奖励:假设我必须覆盖render(),我注意到在这样做时,this.uiMarionette Views 上提供的属性不再将每个项目包装为 jQuery 对象。这意味着:

this.ui.loadingNotification.show();

停止运行,抛出Uncaught TypeError: Object #loading-load-data has no method 'show'. 为什么会这样,我怎样才能恢复正确的this.uijQuery 包装功能?

编辑:解决了奖金;只需在方法中进行this.bindUIElements()调用render()以将元素正确绑定到ui哈希。请参见render()上面的示例。

4

1 回答 1

2

已解决:所以答案非常简单。事实证明,您可以将参数传递给 template: 用作函数时的属性,并且此参数表示与该视图/模板关联的模型:

template: function (model) {
    var templateParams = _.extend({}, model, localizedText),
        renderedTemplate = Handlebars.compileClean(template);

    return renderedTemplate(templateParams);
},

render()然后不再需要覆盖该方法,i18n 文本和模型数据都可以按预期呈现到模板中。

于 2012-12-05T19:03:11.243 回答