2016-07-25 64 views
0

我正在製作一個購物車的複雜表單,我想在訂單處理的不同階段驗證我的order對象的不同部分。在對象生命週期的不同階段更改流星模式驗證?

OrderSchema = new SimpleSchema({ 
    itemsOrdered: { 
    type: [Object], 
    optional: false, 
    }, 
    totalPrice: { 
    type: Number, 
    optional: false, 
    }, 
    status: { 
    type: String, 
    optional: false 
    }, 
    termsAgreed: { 
    type: Boolean, 
    optional: false 
    }, 
    customerAddress: { 
    type: Object, 
    optional: false 
    }, 
    stripePaymentInfo: { 
    type: Object, 
    optional: true, 
    blackbox: true 
    }, 
}); 

這有點亂七八糟IMO,因爲不同的領域必須在order的生命週期的不同階段,不同的驗證了。

  • 在選擇產品的中間用戶仍然還沒有termsAgreedcustomerAddress,或stripePaymentInfo但我不想因爲這兩個驗證失敗,因爲它仍然爲時過早在訂購流程驗證此

  • 填寫他們的客戶地址的用戶不需要stripePaymentInfotermsAgreed

我需要的模式,以在不同階段成功驗證觸發像使continue按鈕的東西。

問題是autoform總是希望使用整個模式來驗證整個對象,對於像聯繫人表單這樣的簡單對象來說這很好,並且這樣的生命週期並不多。

在他們的生命週期的不同階段是否有複雜對象驗證的最佳實踐或模式?

+0

介意試圖將其拆分成子模式並從中選擇與之結合以派生不同的模式?或者取而代之的是在不同階段從中提取。 – Season

+0

你會如何使用'autoform'在不同的時間調用這些子模式? – fuzzybabybunny

回答

2

我認爲最乾淨的是有一個模式與自定義驗證,基於問題中的「狀態」進行驗證,在這種情況下爲Order。 「狀態」可以根據事先存在的東西來確定,如果你可以確定已經存在的東西,或者通過你放置在你的Order中的某些「狀態值」,如枚舉或其他東西。通過這種方式,您的驗證即可使用開箱即用的SimpleSchema功能,而且您不受限於可能會破壞下游功能的任何一次性解決方案。

然後,您會編寫一個custom validation function來查看狀態,並在狀態需要時進行驗證,或者只是返回驗證狀態,以便在沒有驗證錯誤的情況下正確通過驗證。

+0

同意,這需要自定義驗證。一個(雜亂)的替代方案是使用臨時收集進行正在進行的訂單,然後將臨時文檔合併到主集合中,直到規則明確。 –

+0

我明白了。有沒有已經建立的模式或最佳實踐?我希望隨着嚮導的每個步驟都得到驗證,它會隨時在形式嚮導中使用。我可以看到自定義驗證也變得混亂,因爲對單個值的驗證可能會根據許多不同的狀態進行更改。我的感覺是'autoform'與* one * schema緊密結合在一起。在用戶通過表單工作時,將模式交換出單個autoform將會很好。 – fuzzybabybunny

+0

表單嚮導的替代方法是讓每個頁面由單獨的模式表示。然後你會有一些統一的ID /對象將它們鏈接在一起。大多數情況下,表單嚮導數據通常都會被隔離爲「類似數據」,頁面上的元素有些相關(地址/電話在一頁上,健康信息在另一頁上等)。就模式而言,我認爲沒有任何事情可以實現。我認爲這歸結於您作爲開發人員感到最舒適的支持。 – CodeChimp