字段构造函数中的隐式Lang

时间:2013-11-21 13:25:04

标签: scala playframework internationalization playframework-2.2

在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

1 个答案:

答案 0 :(得分:1)

这是因为您尝试使用字段构造函数调用的FieldConstructor方法需要一个参数函数,但现在您给它一个多参数列表,这就是错误中类型不匹配的原因。< / p>

也许您可以使用隐式[Lang]预先提供隐式参数,例如

@implicitFieldConstructor = @{ 
  FieldConstructor(views.html.helpers.fieldConstructor.f(_)(implicitly[Lang]) 
}