2012-06-06 117 views
0

我注意到,當我有這樣的代碼:http://jsfiddle.net/MtULf/1/Backbone.Model`defaults`干擾`set`?

window.Todo = Backbone.Model.extend({ 
    defaults: { 
     "title": "" 
    }, 
    validate: function() { 
     if (this.get("title") === "") 
      return "Title is missing!"    
    } 
}); 

var todo = new Todo(); 
console.log("Expects blank: ", todo.get("title")); 

todo.set({ title: "A valid title" }); 
console.log("Expects 'A valid title': ", todo.get("title")); 

todo.set("title", ""); 
console.log("Expects blank: ", todo.get("title")); 

所有set(...)似乎失敗:todo.get("title")總是返回空字符串

但是,如果我刪除defaults,我得到預期的輸出:http://jsfiddle.net/MtULf/2/

window.Todo = Backbone.Model.extend({ 
    validate: function() { 
     if (this.get("title") === "") 
      return "Title is missing!"    
    } 
}); 
+0

這是問題所在。一旦使用驗證功能創建模型。每套都使用該功能進行驗證。 **如果您在施工期間未指定屬性,**將自動應用默認值。因此'var todo = new Todo();'會使'title =「」'和'todo.set({title:「Valid title」});''會失敗,因爲你的validate函數返回一個錯誤。所有你需要做的就是'var todo = new Todo({title:「New Title」});' – Deeptechtons

+0

我想我失去了你在*和'todo.set({title:「Valid title」})''將失敗,因爲你的驗證函數返回一個錯誤*「。爲什麼要設置'title =「有效標題」'失敗?你的意思是構造函數會失敗或什麼? – jm2

+0

你可能會看看我爲你製作的小提琴http://jsfiddle.net/MtULf/5/ – Deeptechtons

回答

2

驗證沒有得到模型,因爲它的背景,所以你需要使用的功能屬性來工作,那麼它可以作爲預期(除了驗證防止標題被設置爲空)

http://jsfiddle.net/MtULf/3/

不,這不是真的,是吧..驗證確實獲取模型作爲上下文,但在模型中設置值之前驗證運行,因此在默認設置爲「」但成功時沒有默認成功,因爲未定義! ===「」。

好的,我想我當時就知道了..

+0

[「驗證**在'set'和'save'之前被調用,並且傳遞了模型屬性用'set'或'save'中的值更新。「](http://documentcloud.github.com/backbone/#Model-validate),所以是的,你知道了,那是+1。 –

+0

哦,所以我認爲你的版本是有意義的,驗證會阻止模型進入無效狀態。然而,你如何解釋爲什麼在** [版本2](http://jsfiddle.net/MtULf/2/)**,沒有'defaults','set(「title」,「」)'成功? – jm2

+0

這是因爲,沒有默認值,驗證通過,因爲undefined不是一個空字符串(這是你的驗證器正在檢查.. http://jsfiddle.net/MtULf/4/ – lecstor