【发布时间】:2013-11-17 03:34:28
【问题描述】:
我有 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>
非常感谢您对解决此问题的最佳方法的一些见解!
【问题讨论】:
-
您不必将
model.toJSON()传递给模板函数,您可以将toJSON()转换成不同的形式... -
你能详细说明一下吗?我不确定我是否理解。 (对于主干来说还是很新的)
-
也许你正在尝试做的一个更完整的例子会让我们更容易谈论。
-
好的,我发布了一些代码,希望能解决这个问题。还有 mu,我的滑雪板伙伴,感谢您解答我所有的骨干问题 =) 非常感谢。
-
我认为依赖的 EDIT 方法是有道理的。您需要在某个地方规范化属性。如果你想使用一个集合,那么你应该在模型中对它们进行规范化,这样集合才有意义;如果您不需要集合,那么您可以使用某种适配器(可能是模型上的一种方法)让视图知道模型中调用了哪些内容,然后视图可以映射内容以匹配模板。跨度>
标签: javascript templates backbone.js view model