这个问题很难用文字描述,所以如果需要澄清,请告诉我。 我对backbone.js很新,所以这可能是一个愚蠢的问题。
我想使用骨干来轻松创建图形(highcharts库)。我希望保留一个巨大的json对象,其中包含我的默认设置中的所有常见高图设置。模型中的对象。然后,我想覆盖一些变量,例如包含需要渲染图表的dom元素名称的变量。
这是我的代码:
var app = {
Views:{},
Models:{},
Collections:{},
init:function(){
new app.Views.PageView();
}
};
$().ready(_.bind(app.init,app));
app.Models.chart = Backbone.Model.extend({
defaults:{
chart:{
renderTo:'charts',
backgroundColor:'#e1e1e1',
height:200,
width:200,
defaultSeriesType:'spline',
spacingRight:40,
animation:false
},
colors:['#000', '#AA4643'],
title:{
text:''
},
//lots lots lots of other attributes defined here.
app.Views.ChartView = Backbone.View.extend({
render : function() {
var chartContainer = this.model.attributes.chart.renderTo;
$('#charts').append("<div id="+chartContainer+"></div>");
new Highcharts.Chart(this.model.toJSON());
return this;
}
});
var chartDetails = [{chart:{renderTo:'div1'}},{chart:{renderTo:'div2'}}];
app.Views.PageView = Backbone.View.extend({
el: $("#charts"),
initialize : function(){
this.chartCollection = new app.Collections.Charts(chartDetails);
this.render();
},
render: function(){
var that = this;
_.each(this.chartCollection.models, function(item){
that.renderChart(item);
})
},
renderChart : function (item) {
var chartView = new app.Views.ChartView({
model: item
});
chartView.render();
}
});
所以,真正的问题是:当我定义一个新的集合时,我提供了&#39; chartDetails&#39;对象,它会覆盖我的默认&#39;在模型中指定。因此,它不是更新defaults.charts.renderTo属性,而是替换完整的defaults.charts对象。除了我想要替换的值之外,我如何使它保存存储在那里的所有内容(backgroundColor等)?
提前致谢 ķ
答案 0 :(得分:2)
一个非常简单的方法,如果你的模型具有平面表示,那么就可以将defaults
定义为函数
app.Models.Chart = Backbone.Model.extend(
{
// we're using constructor to set this.options
// as defaults gets called before initialize
constructor: function (attrs, options)
{
this.attrs = attrs;
Backbone.Model.prototype.constructor.apply(this, arguments)
},
// defaults can be defined as a function, yeah!
defaults: function ()
{
var defaults = {
renderTo: 'charts',
backgroundColor: '#e1e1e1',
height: 200,
width: 200,
defaultSeriesType: 'spline',
spacingRight: 40,
animation: false
};
return _.extend({}, defaults, this.attrs);
}
});
我更喜欢这种实现在这样的实现之上,因为你不是一次性将你的引导程序绑在一起,这实际上可能会触发不需要的事件:
app.Models.Chart = Backbone.Model.extend(
{
initialize: function (attrs, options)
{
// this might trigger events, even if you make it {silent: true}
// and is why I prefer the above implementation instead
this.set(attrs);
},
defaults: {
renderTo: 'charts',
backgroundColor: '#e1e1e1',
height: 200,
width: 200,
defaultSeriesType: 'spline',
spacingRight: 40,
animation: false
};
});
但是由于你有一个深度嵌套而不是模型的平面表示,你将不得不做一些额外的魔法来只替换嵌套对象中的单个键/值对,因为如果你决定覆盖整个对象如上例所示扩展它。
谢天谢地,jQuery的extend
方法,而不是下划线.js的extend
方法为我们提供了deep
参数,以便您可以这样做:
app.Models.Chart = Backbone.Model.extend(
{
// we're using constructor to set this.options
// as defaults gets called before initialize
constructor: function (attrs, options)
{
this.attrs = attrs;
Backbone.Model.prototype.constructor.apply(this, arguments)
},
// defaults can be defined as a function, yeah!
defaults: function ()
{
var defaults = {
renderTo: 'charts',
backgroundColor: '#e1e1e1',
height: 200,
width: 200,
defaultSeriesType: 'spline',
spacingRight: 40,
animation: false
};
return $.extend(true, {}, defaults, this.attrs); // thank you jQuery!
}
});
答案 1 :(得分:0)
您可以使用initialize函数进行一些自定义数据处理。
myModel = Backbone.Model.extends({
initialize: function(myObject){
// do some stuff with myObject
}
});