【问题标题】:grails: how to dynamically construct a form?grails:如何动态构造表单?
【发布时间】:2014-03-04 22:06:05
【问题描述】:

我需要在 grails 中创建一个动态表单,该表单在运行时具有各种动态创建的输入框,然后将其参数提交给控制器,就像在编译时创建的表单一样。有什么想法吗?

视图 gsp 可能如下所示:

<g:form controller="report" action="view">          
   <input type="submit" value="Submit">
   <!-- insert some inuput params here at runtime -->
</g:form>

动作控制器是:

class ReportController {
def view = {
    def someDynamicParam = "someParam"
    if (params["someParam"] != null) {
       ...
    }

问题是我不知道如何以 Grails 在提交时理解它们的方式呈现表单输入字段。

【问题讨论】:

  • 运行grails install-templates 并查看用于生成脚手架视图的脚本。里面可能有一两个提示。
  • 您希望在哪里创建输入字段 - 在客户端浏览器或服务器端?因此,请分别查看 zoran119 的评论或 Sérgio 的回答

标签: forms grails


【解决方案1】:

我会做类似的事情

<g:form controller="report" action="view">          
  <input type="submit" value="Submit">
  <g:if test="${checkIfParamsExists}">
    <input type="text" id="newParamName"/>
  </g:if>
</g:form>

在控制器端,您的代码应该可以正常工作。

【讨论】:

  • 我明白了,非常感谢。作为次要问题,我认为我还需要添加 javascript 来进行任何客户端验证,例如检查他们没有在数字类型输入中输入字符。如果我在服务器端进行此检查,则为时已晚,因为我无法显示输入表单的哪一部分有错误,因为它已经提交,我最终会进入一个新页面。
  • 在生成表单的同时,grails 还会根据使用的域生成所有需要的客户端验证。因此,在生成表单后,只需复制您想要的参数部分并将其粘贴到 g:if 部分中。表单部分如下所示(您需要为每个参数复制此部分)
【解决方案2】:

要创建动态输入,您需要 JavaScript。我建议你使用一些框架来使它更容易。以 JQuery 为例:

$('<input>').attr({
    type: 'text',
    id: 'foo',
    name: 'foo'
}).appendTo('form');

然后你需要考虑如何将它绑定到域类。查看您的问题,我看不到您需要什么,但让我们举一个用户可以设置值的示例:

//domain class
class MyDomainClass {
  String value
}

//javascript to add a new value
$('<input>').attr({
    type: 'text',
    name: 'values'
}).appendTo('form');

//controller submit action
class MyController {
  def save() {
    def values = params.list('values') //get the list of values
    values.each {
      MyDomain instance = new MyDomain(value: it)
      instance.save()
    }
  }
}

这里的关键是在你的 html 中使用相同的name,并使用params.list() 来转换 List 中提交的值。

【讨论】:

  • 你不需要 javascript。这只是一种方法。他可以编写一个标签库来提供帮助。或者只是在 GSP 上有一些迭代和条件逻辑。 JavaScript 可能是我使用动态表单的最后手段。
  • 对,我认为 OP 想要一个像“添加更多”按钮这样的东西来创建新的输入。如果只是为了检查是否需要出现某些输入,我同意你的看法。
猜你喜欢
  • 2018-11-05
  • 1970-01-01
  • 2017-11-12
  • 1970-01-01
  • 1970-01-01
  • 2022-12-06
  • 2014-11-14
  • 1970-01-01
  • 2011-03-03
相关资源
最近更新 更多