由於Play模板圖層中缺少泛型支持,導致出現catch 22情況。沒有泛型支持的嵌套對象:解決方法
我有幾個購物車屏幕,都需要用戶和付款+可選的自定義字段。
case class Conference(
user: User,
payment: Payment
... custom fields here
)
所以,而不是重複單店購物車模型中的所有用戶和支付表單字段,我已經合併爲上述實施嵌套形式。
現在,問題發生在迄今爲止沒有泛型支持的模板層。
家長/容器形式在嵌套的子形式拉動像這樣:
@(_form: Form[Conference])
@user.nested(UserForm.form.fill(_form.get.user))
@payment.nested(PaymentForm.form.fill(_form.get.payment))
,然後將孩子用戶形式如下:
@(_form: Form[User])
@inputText(_form("user.firstName"), '_label-> "First Name*", 'class-> "required")
@inputText(_form("user.lastName"), '_label-> "Last Name*", 'class-> "required")
...
和用戶模型:
case class User(firstName: String, lastName: String ...)
當用戶模型中沒有用戶屬性時,如何訪問「user.firstName」,「user.lastName」等?播放格式適用的方法是:
def apply(key: String): Field = Field(
this,
key,
constraints.get(key).getOrElse(Nil),
formats.get(key),
errors.collect { case e if e.key == key => e },
data.get(key))
基本上它的要去找物業data.user.firstName
這顯然是行不通的。
我想過加入一個用戶屬性用戶模式:
case class User(firstName: String, lastName: String ...) {
val user: User
}
但不能肯定是否將工作和/或與案例類的同伴對象肆虐申請/取消應用。
無論如何,鑑於缺乏仿製藥,對這個問題有什麼可行的解決方案?
被仿製藥的支持,我們可以在一個上限瞬息,一切會是美好的:
trait CartOrder {
user: User,
payment: Payment
}
case class Conference(...) extends CartOrder
,然後嵌套用戶形式傳遞一個包含用戶屬性的情況下,我們是很好的
@[T <: CartOrder](_form: Form[T])
@inputText(_form("user.firstName"), '_label-> "First Name*", 'class-> "required")
...
我不完全確定我得到你的問題Re:泛型。難道你不能把它作爲Form [CartOrder]參數化呢? 另外,關於用戶問題。你可以做的一件事是將用戶映射與用戶表單分開。然後,您可以在會議表單中重新使用該映射,然後在用戶表單中使用userMapping.withPrefix(「user」),以便訪問鍵保持一致。 – thatsmydoing 2012-08-10 16:28:35
對,我一直在努力做到這一點;然而,它不像指定Form [CartOrder]那樣簡單,出現錯誤:「類型play.api.data.Form在類型T中不變」。所以編譯器接受會議從CartOrder派生,但是Play定義了Form [T]而不是Form [+ T] – virtualeyes 2012-08-10 16:50:11
哦,好的。我不知道它是不變的。我可以向你建議的另一件事是,要有一個CartOrder類型的Form/Mapping,然後對所有可選字段使用可選映射,然後在主映射函數中使用可選映射,返回適當的具體類型。雖然 – thatsmydoing 2012-08-10 17:02:41