在Play Framework 2.2.1应用程序中,我有一个custom field constructor,如下所示:
@(elements: helper.FieldElements)
<div class="form-group @if(elements.hasErrors) {has-error}">
<label for="@elements.id" class="control-label">@elements.label</label>
@if(elements.input.toString().contains("class=")) {
@Html(elements.input.toString().replaceFirst("(class=[\"'])", "$1form-control "))
} else {
@Html(elements.input.toString().replaceFirst("(<\\w+ )", "$1class=\"form-control\" "))
}
@if(!elements.infos.isEmpty) { <p class="help-block text-muted">@elements.infos(elements.lang).mkString("; ")</p> }
@if(!elements.errors.isEmpty) { <p class="help-block">@elements.errors(elements.lang).mkString("; ")</p> }
</div>
我从这样的模板中引用它:
@()(implicit lang: Lang)
@implicitFieldConstructor = @{ FieldConstructor(views.html.helpers.fieldConstructor.f) }
一切正常,包括本地化。
问题是:如何避免将elements.lang
明确传递给infos()
和errors()
?
如果我向字段构造函数添加一个隐式Lang参数,如下所示:
@(elements: helper.FieldElements)(implicit lang: Lang)
然后我在另一个模板的引用中得到了这个编译错误:
type mismatch;
found : views.html.helper.FieldElements => (play.api.i18n.Lang => play.api.templates.HtmlFormat.Appendable)
required: views.html.helper.FieldElements => play.api.templates.Html
答案 0 :(得分:1)
这是因为您尝试使用字段构造函数调用的FieldConstructor
方法需要一个参数函数,但现在您给它一个多参数列表,这就是错误中类型不匹配的原因。< / p>
也许您可以使用隐式[Lang]预先提供隐式参数,例如
@implicitFieldConstructor = @{
FieldConstructor(views.html.helpers.fieldConstructor.f(_)(implicitly[Lang])
}