Javascript 未统一命名模型属性的主干集合和模板

Javascript 未统一命名模型属性的主干集合和模板,javascript,templates,backbone.js,view,model,Javascript,Templates,Backbone.js,View,Model,我有4个模型,每个模型都有不同的属性。例如,一个可能看起来像{total:4},另一个可能是{change:.5}。这些模型将以相同的格式显示,也就是说,它们在呈现HTML时看起来是相同的。我想知道这是否适合使用集合并为每个模型创建相同的视图。我很困惑,因为对每个视图使用相同的模板是很理想的,但是在一个视图的模板中,我必须为另一个视图显示类似和的属性。我不认为检查模板中的模型是正确的,所以我想知道我应该为每个模型创建一个新模板(即使模板中唯一的区别是属性的名称),还是应该重命名每个模型中的模型属

我有4个模型,每个模型都有不同的属性。例如,一个可能看起来像{total:4},另一个可能是{change:.5}。这些模型将以相同的格式显示,也就是说,它们在呈现HTML时看起来是相同的。我想知道这是否适合使用集合并为每个模型创建相同的视图。我很困惑,因为对每个视图使用相同的模板是很理想的,但是在一个视图的模板中,我必须为另一个视图显示类似和的属性。我不认为检查模板中的模型是正确的,所以我想知道我应该为每个模型创建一个新模板(即使模板中唯一的区别是属性的名称),还是应该重命名每个模型中的模型属性,以便它们都匹配。下面是一些代码,希望足以理解这个问题

var Chart = Backbone.Model.extend({ initialize: function() { console.log('please work')}});
chart1 = new Chart({title: 'total', total: 123});
chart2 = new Chart({title: 'change', difference: '20%'});

var ChartView = Backbone.View.extend({
className: "chart-container",
template: $("#chartTemplate").html(),

render: function () {
    var tmpl = _.template(this.template);

    this.$el.html(tmpl(this.model.toJSON()));
    return this;
}
});

var Charts = Backbone.Collection.extend({ model: Chart});
var myCharts = new Charts([chart1, chart2]);

var MasterView = Backbone.View.extend({
el: $("#charts"),

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

render: function () {
    var that = this;
    _.each(this.collection.models, function (model) {
        that.renderChart(model);
    }, this);
},

renderChart: function (model) {
    var chartView = new ChartView({
        model: model
    });
    this.$el.append(chartView.render().el);
}
});
模板:

<script id="contactTemplate" type="text/template">
<h1> <%= title%></h1>
<p> <%= total? difference? %></p>
</script>


如果您能对这方面的最佳方法有所了解,我们将不胜感激

使用BackboneJS时,不必显式地将集合绑定到模板。不过,您可以做的是创建一个更通用的模板,然后传入要渲染的值

var myView=Backbone.View.extend({
el:$('myElement'),
渲染:函数(文本){
这个.el.html(“我的文本:“+Text+”

”); 归还这个; } });
然后,当调用渲染方法时,只需传递要渲染的文本。这样,无论您使用的是哪种模型或集合,只需传递必要的信息即可

编辑

好的,看看你的代码,我现在明白你来自哪里了。我认为,拥有不同属性的相同模型不是一个好的做法。主干模型旨在镜像服务器端的模型。不要在两个模型之间有不同的属性,而是找到两个定义两个值的属性名

我的意思是:

请注意,现在只有两个常用属性:name和value,而不是“total”和“difference”。当然,这假设您不会再添加任何彼此不同的属性


希望这有点道理。如果需要澄清,请告诉我。

使用单个模板,并在模型中引入序列化函数,该函数可将模型数据序列化为模板可以理解的内容。然后改变

 this.$el.html(tmpl(this.model.toJSON()));


这并不是什么新鲜事,我记得主干布局管理器中使用了这种模式。

您不必将
model.toJSON()
传递给模板函数,您可以将
toJSON()
转换成另一种形式……您能详细说明一下吗?我不太明白。(对主干网来说仍然很陌生)也许你正在尝试做的一个更完整的例子会让我们更容易讨论。好的,我发布了一些代码,希望能澄清这个问题。还有穆,我的滑雪同伴,谢谢你帮我解答了所有的主要问题=)真的很感激。我认为relynt的编辑方法很有意义。在某些地方,您需要规范化属性。如果要使用集合,则应在模型中对其进行规范化,以便集合有意义;如果您不需要集合,那么您可以使用某种适配器(可能是模型上的方法)让视图知道在模型中调用了什么,然后视图可以映射内容以匹配模板。在这种情况下,我不需要为4个不同的模型使用4个不同的视图吗?理想情况下,我希望重用视图和模板。您需要为模型上的事件设置回调。例如,您可以设置在模型上发生同步时调用的“update”方法。在这个update方法内部,您可以调用这个特定的render。因为在每个模型中都设置了此回调,所以您将知道要传递给渲染的属性。
 this.$el.html(tmpl(this.model.toJSON()));
 this.$el.html(tmpl(this.model.serialize()));