2011-08-12 104 views
8

注意:我正在處理一個後端,我沒有完全控制,所以我在Backbone中考慮了一些注意事項,可能會在其他地方更好地解決...不幸的是,我不得不在這裏處理它們!因此,我的問題是我真的很想驗證表單中的用戶輸入(當我在Backbone模型上設置值時),但是我從API上接收到的新創建對象的模型(通過帖子只接受一個名稱,並且只返回一個名稱和對象id)將會失敗我的驗證檢查。例如,當在數據庫中創建一個新對象時,兩個關鍵字段被填充爲空字符串(所以當Backbone命中API並填充模型時,它會用空字符串填充這些鍵)。當用戶保存這些對象後,編輯後,我想迫使他們輸入這兩個鍵的值 - 這很容易,給定Backbone的內置驗證方法。Backbone.js模型驗證僅在set-> save(而不是獲取)

當然,問題在於驗證在fetch-> set(不需要的行爲)和set-> save(期望的行爲)上觸發 - 所以新創建的模型根本不會加載.. 。骨骼收集它們,驗證失敗,錯誤觸發。

所以,我的問題是:是否有一個「Backbone-y」方式來驗證set-> save上的模型,而不是fetch-> set?我可以使用特定的觸發器來解決這個問題嗎?

任何想法將不勝感激。如果您在{ silent: true }通過

回答

7

Backbone.Model.set不會執行驗證,並fetch將通過設置任何選項,這樣你既可以覆蓋fetch或編寫可以通過在一個選項對象自己fetchSilent方法。

但是,您可能會遇到Backbone.Collection.fetch的一個小問題,因爲當它從服務器接收到屬性時,它不會使用set創建新模型。相反,它會創建一個新模型model = new this.model(attrs, {collection: this});,然後在對象上有validate方法時執行驗證。

這有點煩人。您可以通過在集合上定義一個parse方法(如果您使用的方法)來靜默創建模型(使用{silent: true}),因爲當Backbone.Collection.add接收到完全形成的Backbone模型時,它將不會運行驗證。 (請參閱annotated source中的_add_prepareModel方法)。

有點煩人的是,收集的作品,但(至少現在)它是這樣。

+0

確實令人討厭,但感謝提示 - 非常感謝。 – ltd

+0

就我所見,在最新的源代碼骨幹中,即使在靜默通過時設置也會進行驗證,因此不會有幫助 –

4

而不是壓倒一切的獲取你可以做的另一件事:

當您驗證模型,檢查model.silent,如果不存在唯一的驗證。

var test = new MyModel({ id: '123', silent: true }); 

// in your Model validate function 
validate: function(attrs) { 
    if (!attrs.silent) { 
    // validate logic here 
    } 
} 

然後你就可以獲取模型:

所以,當你想獲取一個模型,你做到以下幾點。獲得模型後,您可以取消靜默,以供將來驗證。

相關問題