我刚刚开始使用backbone.js,我正在寻找一种在模型上声明字段而不必提供默认值的方法。它只是供参考,所以当我开始创建实例时,我可以看到我需要初始化的字段。
像java这样的东西我写了
public class CartLine{
StockItem stockItem;
int quantity;
public int getPrice(){
return stockItem.getPrice() * quantity;
}
public int getStockID(){
//
}
}
然而,对于骨干模型,我引用了我的方法中的字段,但我实际上并没有声明它们 - 看起来我可以轻松地创建一个不包含{{1}的CartLine
对象}属性或stockItem
属性。当我声明对象时,不要提到字段,这感觉很奇怪。特别是因为该对象应该代表服务器上的实体。
quantity
我想我可以使用validate -
添加某种引用var CartLine = Backbone.Model.extend({
getStockID: function(){
return this.stockItem.id;
},
getTotalPrice: function() {
return this.quantity * this.StockItem.get('price');
}
});
但我的问题是 - 我错过了什么吗?是否有既定的模式?
答案 0 :(得分:3)
defaults
实际上是“字段”或作为json的一部分从服务器来回传输的数据。
如果您只想创建一些成员变量作为模型的一部分,这些变量是专有的,不会在服务器上来回发送,那么您可以在对象本身或b)中声明它们a) initialize方法(在构造期间调用),它们可以作为opts的一部分传入:
var Widget = Backbone.Model.extend({
widgetCount: 0,
defaults: {
id: null,
name: null
}
initialize: function(attr, opts) {
// attr contains the "fields" set on the model
// opts contains anything passed in after attr
// so we can do things like this
if( opts && opts.widgetCount ) {
this.widgetCount = opts.widgetCount;
}
}
});
var widget = new Widget({name: 'the blue one'}, {widgetCount: 20});
请记住,如果在类上声明对象或数组,它们本质上是常量,更改它们将修改所有实例:
var Widget = Backbone.Model.extend({
someOpts: { one: 1, two: 2},
initialize: function(attr, opts) {
// this is probably not going to do what you want because it will
// modify `someOpts` for all Widget instances.
this.someOpts.one = opts.one;
}
});