2013-05-01 42 views
3

我剛剛開始使用backbone.js,我正在尋找一種在模型上聲明字段而不必提供默認值的方法。這僅僅是供參考,所以當我開始創建實例時,我可以看到我需要初始化哪些字段。在不設置默認值的情況下在骨幹模型上聲明變量

的東西像Java我會寫

public class CartLine{ 
    StockItem stockItem; 
    int quantity; 

    public int getPrice(){ 
     return stockItem.getPrice() * quantity; 
    } 

    public int getStockID(){ 
     // 
    } 
} 
與骨幹機型

不過,我引用我的方法的領域,但我實際上沒有宣佈他們 - 它看起來像我可以很容易地創建一個CartLine對象不包含stockItem屬性或quantity屬性。當我聲明對象時,不要提及這些字段感覺很奇怪。特別是因爲該對象應該表示服務器上的實體。

var CartLine = Backbone.Model.extend({ 

    getStockID: function(){ 
    return this.stockItem.id; 
    }, 

    getTotalPrice: function() { 
    return this.quantity * this.StockItem.get('price'); 
    } 
}); 

我想我可以通過驗證加參考某種 -

CartLine.validate = function(attrs){ 
    if (!(attrs.stockItem instanceof StockItem)){ 
    return "No Valid StockItem set"; 
    } 
    if (typeof attrs.quantity !== 'number'){ 
    return "No quantity set"; 
    } 
} 

但我的問題是 - 我這麼想嗎?這是否有一個確定的模式?

+0

Jsdoc/comments ?這就是我使用的,如果我不只是設置默認值'null'。 – WiredPrairie 2013-05-01 11:12:04

+0

模型保存給定資源的URL,並根據需要構建您的請求數據。你爲什麼要聲明沒有默認值的變量?無論如何,你可以聲明變量,如聲明私有或公共變量在一個JavaScript「類」 – juanpastas 2013-05-01 14:46:43

回答

3

defaults實際上是作爲json的一部分從服務器來回傳輸的「字段」或數據。

如果您只是想創建一些成員變量作爲模型的一部分,這些變量是專有的,並且不會被髮送到服務器,那麼您可以聲明它們是a)在對象本身上或b)在該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; 
    } 
});