2012-03-09 49 views
5

當首次創建新模型時,有沒有一種方法可以在Backbone.js中抑制模型驗證?阻止Backbone.js模型從第一次添加到集合時進行驗證

在我的應用程序中,我有一個任意數量的模型的集合,它們被表示爲列表項。用戶可以點擊每個項目上的按鈕,在當前項目下插入一個新的空項目。顯然,空項目驗證失敗,因爲我不想在稍後保存空項目。

當我創建新項目時,我無法知道什麼是合理的默認值,因此使用有效數據預先填充新模型似乎不是一種選擇。

有什麼建議嗎?

更新:在處理切線相關的問題時,我意識到我使用的是Backbone.js 0.9.0版。當這個版本發佈時,其他人遇到了同樣的問題,他們在GitHub的this issue上投訴。

Jeremy修改了0.9.1中的驗證來解決這個問題。將(暫時)空模型添加到集合中是一種有效的現實世界用例。您可以在視圖中處理新的空模型,但是如果您像管理項目列表一樣管理項目列表,則會強制您收集項目視圖(包括空白視圖)無效的模型。對於其他直截了當的情況來說,這是一個非常笨拙的解決方法。很高興這已得到修復。

回答

3

你不應該添加無效的模型:)

挖骨幹源代碼位(0.9.1至少)表明,該機制可以通過傳遞選項,你的add方法來回避:

var Mod=Backbone.Model.extend({ 
    validate: function(attrs,opts) { 
     if (opts.init) return; 
     return "invalid"; 
    } 
}); 

var Col=Backbone.Collection.extend({ 
    model:Mod 
}); 

var c=new Col(); 
c.add({},{init:true}); 

console.log(c.length); 

小提琴:http://jsfiddle.net/jZeYB/

警告:它可能會破壞下來的東西就行了。

+0

不添加無效模型在理論上是有道理的,但我想不出讓用戶添加新行的更好方法。我想我可以在視圖中處理所有這些內容,然後在該集合有效時將其添加到集合中,但這會使此應用程序的其他方面複雜化。你的例子工作的很好,但是當我在我的應用程序中嘗試它時,'options'參數被'{silent:true}'對象覆蓋,Backbone.js似乎自動鞋拔。我現在很困惑。 – 2012-03-09 13:12:51

+0

您不應該添加無效模型 - 視圖應該捕獲模型驗證發送的'error'消息,並讓用戶修復它們的輸入或將其取消。當我從我們的服務器中抽取東西時,獲取無效數據我只是將它放在地板上(並將消息發送到我們的Ajax日誌記錄工具),因爲集合中的無效模型是'壞主意' – tkone 2012-03-10 14:41:13

2

您是否需要將模型添加到集合中?我認爲驗證失敗,因爲您立即將它添加到集合中。

相反,當按下按鈕時,您可以創建視圖和空白模型。模型驗證後,將其添加到集合中。您需要在新行上提交按鈕/機制才能將其添加到集合中(這會自動調用驗證)。

+0

我打算給這個鏡頭。我大概可以在模型的'change'處理程序中添加該項,這將消除對提交按鈕的需求。當該領域失去焦點時它會被添加。謝謝! – 2012-03-12 00:49:33

相關問題