2012-09-30 56 views
1

我已經創建了一個對象:只有在實例上設置時纔對骨幹模型進行驗證?

var Person = Backbone.Model.extend({ 
    defaults: { 
    'name': '', 
    'age': 0 
    }, 
    initialize: function() { 
    this.on('error', function(model, error){ 
     console.log(error); 
    }); 
    }, 
    validate: function(attributes){ 
    if (attributes.name == '') { 
     return "How do we call him!?"; 
    } 
    }, 
    changeName: function(name) { 
    this.set({'name':name}); 
    }, 
    getOlder: function() { 
    this.set({'age': this.get('age') +1}); 
    } 
}); 

我創建一個Person的實例,並放置在一個空白的名字,我從來沒有收到一個錯誤。但是當我在已經創建的實例上設置一個空白名稱時,它激發了驗證。

var teejay = new Person; 
teejay.changeName(''); 
=> How do we call him!? 
teejay.get('name'); 
=> "" 

從什麼,我從骨幹源代碼看,我看到

this.set(attributes, {silent: true}); 

是正確的假設,驗證只是做每當屬性被更改或設置?

+0

「驗證調用之前設置和保存」按骨幹的文檔。 http://backbonejs.org/#Model-validate – 3coins

回答

1

骨幹網將始終調用validate方法時,你setsave與當你在一個哈希傳遞給構造函數或當模型與default哈希實例之外的屬性。

例如

var myperson = new Person({name: ''}); 

不會調用validate方法,因爲構造函數必須返回模型的新實例。

然而,

var myperson = new Person(); 
myperson.set('name', ''); 

意志。

您的validate方法將永遠不會打印任何東西 - 驗證上的return用於測試它是否有效。如果你返回任何「真理」驗證將失敗,但就是這樣。這取決於你觸發'error'消息或其他你想要的東西。

您所看到的與預期完全相同。

TL; DR: 您的defaults散列將不會被驗證,因爲它必須返回有效的模型。

(同樣,請允許我現在擡價我Backbone.Validator項目 - 不要寫你自己的!)