【问题标题】:Purely Dynamic forms using play framework使用播放框架的纯动态表单
【发布时间】:2014-03-18 16:06:08
【问题描述】:

我有一个 Play 2.2 应用程序,它通过外部 Web 服务获取带有字段名称、类型和约束信息的 JSON;这个 JSON 的内容每次都可能不同(尽管整体结构保持不变,只是字段数量等不同)。 现在的要求是根据收到的字段定义呈现 HTML 表单。 有人可以建议最好的方法是什么(我认为通常的游戏形式在这里不是很有用,除非有人可以告诉如何创建动态MappingForm 对象)。 我的想法之一是将 JSON 发送到客户端并使用 Angular 呈现表单,但我不确定如何在服务器端验证它。

【问题讨论】:

    标签: playframework playframework-2.2


    【解决方案1】:

    播放表单是类型安全的,这意味着表单内容是静态定义的(即元组或案例类)。您必须编写代码来动态生成表单并解析结果。

    在 Scala 模板中为表单生成 HTML 有点过于复杂。我建议在对象中编写一个函数来执行此操作,例如:

    object MyHelpers {
      def makeForm(js: JsObject): Html = {
        val xml = 
        <form method="post">
          { js.values.map { e =>
            <input type=text name={e._1} value={e._2}/>
          }}
        </form>
    
        Html(xml.toString)
      }
    }
    

    然后在您的模板中导入函数:@import MyHelpers.makeForm,并在页面中您想要表单的位置调用它。

    使用Action(在这种情况下必须在您的路由文件中指定为 POST)解析表单结果,如下所示:

    def myFormHandler(parse.multipartFormData) { request =>
      val data = for ((key, values) <- request.body.dataParts) yield {
        // validate and process field
      }
    
      OK(view.html.myform())
    }
    

    (如果您的操作是 GET,您可能不想要,请使用 parse.asFormUrlEncoded

    【讨论】:

    • 感谢 Richard,这与我的想法相似,但我不敢实现它,因为我失去了 play-forms 提供的所有功能(折叠、flash 错误、约束、链接等)。 ) 我将被要求自己处理这一切。让我等一下,看看是否有人有任何其他建议(可能是图书馆或我不知道的东西),如果没有,我会将其标记为answer
    【解决方案2】:

    使用 freemarker 作为 Play 框架中的模板播放表单解决方案来执行此操作。我做了一些与工作相关项目的概念证明类似的事情。 https://github.com/rabbipal/Play-2.1-Java-MongoDb-Freemarker-Dynamic-Form。希望对您有所帮助。

    【讨论】:

    • 感谢您添加答案,但请帮助我了解这种诱惑与 Play 提供的诱惑有何不同! Freemarker 有什么特别之处吗?
    • Scala 被编译和缓存,并在您执行“播放开始”(在 prod 模式下运行)时在目标目录之外执行。这意味着在应用程序处于活动状态时无法引入新表单。如果您在开发模式下运行(播放运行),scala 会即时重新编译。因此,为了获得真正的动态表单解决方案,即在生产模式下不需要“编译”的解决方案,您必须使用静态 html 或 freemarker。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-05-02
    • 2013-03-05
    • 2012-04-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多