2012-12-14 53 views
1

昨天,經過很多研究,我發現如果我不想在我的主幹模型上設置單獨的屬性(並驗證),那麼我需要發送{silent: true}。這就是說,我們還發現,在下一版本的backbone.js silent: true實際上仍然會運行驗證。如何在Backbone.js(驗證)中設置單個屬性

問題在於,驗證塊是從實際設置屬性中設置的。所以,如果我們沒有沉默:真的,那麼接受單個屬性的設置方法就沒有意義了。要解決此問題,我們的驗證方法如下所示:

validate : function(attrs) { 
    var errors = {}; 
    if (typeof attrs.first_name !== 'undefined' && !attrs.first_name) { 
     errors.first_name = "First name can't be empty"; 
    } 
    ... 
    if (!_.isEmpty(errors)) { 
     return errors; 
    } 
} 

這會導致保存失效。於是我們決定寫這樣的事:

if (_.isEmpty(attrs)) { 
    attrs = this.attributes; 
} 

有這個問題,如果你有保存,那麼你需要合併他們,我的猜測是確定派往屬性,但是這畢竟是一個體面工作量,以獲得一些簡單的驗證工作/或不運行。此外,除非我重寫_validate,否則我需要在每個模型上執行此操作。

有沒有更好的方法來做到這一點?

+0

您可以創建一個對象,其行爲與mixin類似,然後您可以使用它擴展每個模型。 – Eru

回答

3

骨幹默認擴展了舊屬性與舊的位置:https://github.com/documentcloud/backbone/blob/master/backbone.js#L574

由於這樣,只有新的特性,可能會打破驗證方法。

在這裏,我認爲你的問題是,你太多的驗證與所有屬性的存在,而你沒有在同一時間設置它們。因此,您應確保允許其他屬性設置爲undefined

例如:

// Check if name is set, ignore otherwise 
if(attr.name && attr.name !== "Santa") { return "Can't be Santa"; } 

另一種解決方案是給每個屬性有效的默認值。

+0

啊,這是新事物嗎?它並不習慣於這樣做。 – Parris

相關問題