推送模板数据

时间:2014-07-16 17:24:50

标签: javascript jquery templates backbone.js underscore.js

我有一个骨干视图,如下所示:

var BooksView = Backbone.View.extend({

initialize: function() {
    this.render();
},

render: function() {
   this.model.fetch({
      success : function(model, resp, opt) {
         var data = { model, navigationText: this.navText };

         this.$el.append ( JST['templates/' + "book"] ( data.toJSON() ) );

      }.bind(this)
   });
}

});

基本上,我正在尝试使用模型数据传递模板数据,以及其他非模型数据的数据。现在,我可以这样做:

this.$el.append ( JST['templates/' + "book"] ( model.toJSON() ) );

它将发送模型数据。但是,例如,我有一个变量(navigationText)我想传递给模板,但它不应该是model.set。

使用我当前的代码,我收到错误:Uncaught SyntaxError: Unexpected token ,,因为它不是有效的对象?

1 个答案:

答案 0 :(得分:1)

这不是JavaScript:

var data = { model, navigationText: this.navText };

对象文字是逗号分隔的key: value列表,当您执行上述操作时,JavaScript不会向对象添加navigationText: this.navText。稍后你会说:

data.toJSON()

因此,您可能希望在toJSON上致电model,然后将navigationText密钥添加到结果中:

var data = model.toJSON();
data.navigationText = this.navText;

然后将data交给模板函数:

JST['templates/book'](data)

您还可以重新构建模板,以便模型数据和额外的navigationText保持独立,例如:

<%= model.id %>
<%= navigationText %>

而不是:

<%= id %>
<%= navigationText %>

然后你可以说:

JST['templates/book']({
    model: model.toJSON(),
    navigationText: this.navText
})

这里的一大优势是,您可以避免模型的属性与您希望在模板中添加的任何额外内容之间的重叠。