【问题标题】:Fill dropdown from model list从模型列表中填充下拉列表
【发布时间】:2018-02-05 19:49:58
【问题描述】:

我尝试显示一个从模型中获取其选项的选择字段。

我尝试按照以下 stackoverflow 问题中的说明进行操作:

但我无法让它工作。

给定以下模型:

public class Model {
    private String field;
    private List<String> options
}

还有以下观点:

@(modelForm: Form[models.Model])

@helper.select(field = modelForm("field"), options = helper.options(modelForm("options").value()))

helper.optionsapply 方法有一个 java.util.List[String] 条目,因此它应该可以用于 java 字符串列表。

def apply(options: java.util.List[String]) = options.asScala.map(v => v -> v)

这样我只会得到以下错误:

overloaded method value apply with alternatives:
[error]   (options: java.util.List[String])scala.collection.mutable.Buffer[(String, String)] <and>
[error]   (options: List[String])List[(String, String)] <and>
[error]   (options: java.util.Map[String,String])Seq[(String, String)] <and>
[error]   (options: Map[String,String])Seq[(String, String)] <and>
[error]   (options: (String, String)*)Seq[(String, String)]
[error]  cannot be applied to (String)
[error]             options = helper.options(modelForm("options").value())

如果我另外将表单字段转换为 java.util.List&lt;String&gt; 而不是编译时异常,我会得到运行时异常:

@helper.select(field = modelForm("field"), options = helper.options(modelForm("options").value().asInstanceOf[util.List[String]]))

运行时异常:

[error] ErrorHandler - Exception StackTrace: 
[views.html.modelFormView$.$anonfun$apply$1(modelFormView.template.scala:48), 
views.html.helper.form$.apply(form.template.scala:36), 
views.html.modelFormView$.apply(modelFormView.template.scala:41), 
views.html.modelFormView$.render(modelFormView.template.scala:75), 
views.html.modelFormView.render(modelFormView.template.scala), 
controllers.modelController.requestJwt(modelController.java:71), 
router.Routes$$anonfun$routes$1.$anonfun$applyOrElse$16(Routes.scala:304), 
play.core.routing.HandlerInvokerFactory$$anon$3.resultCall(HandlerInvoker.scala:134), play.core.routing.HandlerInvokerFactory$$anon$3.resultCall(HandlerInvoker.scala:133), play.core.routing.HandlerInvokerFactory$JavaActionInvokerFactory$$anon$8$$anon$2$$anon$1.invocation(HandlerInvoker.scala:108), play.core.j.JavaAction$$anon$1.call(JavaAction.scala:88), 
play.http.DefaultActionCreator$1.call(DefaultActionCreator.java:31), 
play.core.j.JavaAction.$anonfun$apply$8(JavaAction.scala:138), 
scala.concurrent.Future$.$anonfun$apply$1(Future.scala:655), 
scala.util.Success.$anonfun$map$1(Try.scala:251), 
scala.util.Success.map(Try.scala:209), 
scala.concurrent.Future.$anonfun$map$1(Future.scala:289), 
scala.concurrent.impl.Promise.liftedTree1$1(Promise.scala:29), 
scala.concurrent.impl.Promise.$anonfun$transform$1(Promise.scala:29), 
scala.concurrent.impl.CallbackRunnable.run$$$capture(Promise.scala:60), 
scala.concurrent.impl.CallbackRunnable.run(Promise.scala), 
play.core.j.HttpExecutionContext$$anon$2.run(HttpExecutionContext.scala:56), 
play.api.libs.streams.Execution$trampoline$.execute(Execution.scala:70), 
play.core.j.HttpExecutionContext.execute(HttpExecutionContext.scala:48), 
scala.concurrent.impl.CallbackRunnable.executeWithValue(Promise.scala:68), 
scala.concurrent.impl.Promise$KeptPromise$Kept.onComplete(Promise.scala:368), 
scala.concurrent.impl.Promise$KeptPromise$Kept.onComplete$(Promise.scala:367), 
scala.concurrent.impl.Promise$KeptPromise$Successful.onComplete(Promise.scala:375), 
scala.concurrent.impl.Promise.transform(Promise.scala:29), 
scala.concurrent.impl.Promise.transform$(Promise.scala:27), 
scala.concurrent.impl.Promise$KeptPromise$Successful.transform(Promise.scala:375), 
scala.concurrent.Future.map(Future.scala:289), 
scala.concurrent.Future.map$(Future.scala:289), 
scala.concurrent.impl.Promise$KeptPromise$Successful.map(Promise.scala:375), 
scala.concurrent.Future$.apply(Future.scala:655), 
play.core.j.JavaAction.apply(JavaAction.scala:138), 
play.api.mvc.Action.$anonfun$apply$2(Action.scala:96), 
play.api.libs.streams.StrictAccumulator.$anonfun$mapFuture$4(Accumulator.scala:174), 
scala.util.Try$.apply(Try.scala:209), 
play.api.libs.streams.StrictAccumulator.$anonfun$mapFuture$3(Accumulator.scala:174), 
scala.Function1.$anonfun$andThen$1(Function1.scala:52), 
play.api.libs.streams.StrictAccumulator.run(Accumulator.scala:207), 
play.core.server.AkkaHttpServer.$anonfun$runAction$4(AkkaHttpServer.scala:304), 
akka.http.scaladsl.util.FastFuture$.strictTransform$1(FastFuture.scala:41), 
akka.http.scaladsl.util.FastFuture$.$anonfun$transformWith$3(FastFuture.scala:51), 
scala.concurrent.impl.CallbackRunnable.run$$$capture(Promise.scala:60), 
scala.concurrent.impl.CallbackRunnable.run(Promise.scala), 
akka.dispatch.BatchingExecutor$AbstractBatch.processBatch(BatchingExecutor.scala:55), 
akka.dispatch.BatchingExecutor$BlockableBatch.$anonfun$run$1(BatchingExecutor.scala:91), 
scala.runtime.java8.JFunction0$mcV$sp.apply(JFunction0$mcV$sp.java:12), 
scala.concurrent.BlockContext$.withBlockContext(BlockContext.scala:81), 
akka.dispatch.BatchingExecutor$BlockableBatch.run(BatchingExecutor.scala:91), 
akka.dispatch.TaskInvocation.run(AbstractDispatcher.scala:40), 
akka.dispatch.ForkJoinExecutorConfigurator$AkkaForkJoinTask.exec(ForkJoinExecutorConfigurator.scala:43), akka.dispatch.forkjoin.ForkJoinTask.doExec(ForkJoinTask.java:260), 
akka.dispatch.forkjoin.ForkJoinPool$WorkQueue.runTask(ForkJoinPool.java:1339), 
akka.dispatch.forkjoin.ForkJoinPool.runWorker(ForkJoinPool.java:1979), 
akka.dispatch.forkjoin.ForkJoinWorkerThread.run(ForkJoinWorkerThread.java:107)]

我不明白我做错了什么。

【问题讨论】:

    标签: java scala playframework


    【解决方案1】:

    documentation 告诉 helper.select 想要一个 Seq[(String, String)] 作为 options-argument。

    在您的代码中,modelForm("options") 是对 Form 上的方法 apply(name: String) 的调用,该方法返回 Form.Field (doc)。类Form.Field 有一个方法value,但它返回一个String

    String 不是Seq[(String, String)]

    您必须将 Seq[(String, String)] 作为单独的参数传递,或者就地构造它。

    【讨论】:

    • 所以你是说 Form.Field 不能包含列表?
    • "Form" 表示填充了一堆值的表单。如果您有一个选项列表,然后单击一个选项,则您选择 单个String,而不是List&lt;String&gt;。试想一下表单提交的编码是什么样的:它会发送一个字符串值,而不是字符串列表。在代表表单的对象中包含List&lt;String&gt; 对我来说似乎没有多大意义。
    • 听起来合乎逻辑。谢谢你的解释
    【解决方案2】:

    您是否尝试过在旋转选择对象内进行映射?

    @helper.select(field = modelForm("field"), options = modelForm("options").asScala.map(v => v -> v).value()))
    

    因为这些错误:

    [error]   (options: (String, String)*)Seq[(String, String)]
    [error]  cannot be applied to (play.data.Form.Field)
    [error]             options = helper.options(modelForm("options").value())
    

    让我相信它并不期望在那个阶段有地图。

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-09-07
    • 1970-01-01
    • 2011-05-28
    • 1970-01-01
    • 2022-01-11
    • 2021-04-04
    • 1970-01-01
    相关资源
    最近更新 更多