2014-09-13 207 views
0

我有一些代碼:驗證不起作用?

 var Person = new Backbone.Model({name: 'Jeremy'}); 

     Person.validate = function(attrs) { 
      if (!attrs.name) { 
       return 'I need your name'; 
      } 
     }; 

     Person.on("invalid", function(model, error) { 
      alert(model.get("title") + " " + error); 
     }); 


     Person.set({name: 'Samuel'}); 
     console.log(Person.get('name')); 
     // 'Samuel' 

     Person.unset('name', {validate: true}); 
     console.log(Person.get('name'));//Why can i print name here if it unsetted? 

當我輸入未設置方法我看到一個錯誤警報。這是正確的。但是,爲什麼我可以在控制檯中打印名稱,如果它未被設置?

回答

0

name仍然存在,因爲驗證失敗使unset無法執行任何操作。

documentation是不是驗證與setunset是如何工作的非常明確的,但它是相當明確的與save

驗證model.validate(attributes, options)

[...]如果驗證返回錯誤,save將不會繼續,並且模型屬性將不會在服務器上進行修改。

因此可以合理地認爲,驗證錯誤會阻止任何更改當前操作(setunsetsave,...)。

您可以通過檢查Backbone源代碼來了解它是如何工作的。首先,你需要知道unset只是一種變相的set電話:

unset: function(attr, options) { 
    return this.set(attr, void 0, _.extend({}, options, {unset: true})); 
} 

所以我們看set

set: function(key, val, options) { 
    // A bunch of boring bookkeeping stuff... 

    // Run validation. 
    if (!this._validate(attrs, options)) return false; 

    // The stuff that changes attributes and triggers events. 
} 

的驗證,一旦發生,因爲set知道它正在與和如果驗證失敗,則set返回而不更改任何內容。

Backbone文檔留下了很多重要的東西,所以如果您打算使用Backbone,您需要熟悉Backbone源代碼。消息來源相當直接,不要害怕跳進去看看發生了什麼。

+0

感謝您的回答 – 2014-09-14 05:43:52

0

這樣做:要不觸發事件,可以使用silent:true選項。我相信你的代碼中可能存在一些上游問題。無論如何,請執行以下操作 - 它應該有效。 (在我的測試中,它做到了)。

Person.unset('name',{validate: true,silent:true}) 

p.s .: Mu(below)給出了很好的信息。