【问题标题】:grails g:select item as optionValuegrails g:选择项目作为选项值
【发布时间】:2012-12-14 05:25:28
【问题描述】:

我有域类:

class Template {
  String name;
  String prop1;
  String prop2;
}

并使用 g:select: 进行查看

<g:select name="template.id" from="${Template.list()}" optionKey="id" onclick = "updateEditText(this.value);"/>

我需要将选定对象设置为 g:select 值(但不是字符串),我认为它应该是这样的(但它不起作用):

<g:select name="template.id" from="${Template.list()}" optionKey="id" optionValue = "${it}" onclick = "updateEditText(this.value);"/>

*it - 来自 template.list() 的对象

我的程序 updateEditText 需要从选定对象中获取所有属性:

<g: javascript>
   updateEditText(obj) {
      document.getElementByID("prop1").value = obj.prop1;
      document.getElementByID("prop2").value = obj.prop2; //etc
   }
</g:javascript>

如果我使用“prop1”或“prop2”作为选项值,它可以正常工作,但这不是我需要的。 谁能帮帮我?

【问题讨论】:

    标签: javascript grails select


    【解决方案1】:

    您不能将对象从 html 输入传递到 javascript。但是您可以使用 remoteFunction 标签将选定的 id 传递给服务器,在那里检索对象并返回属性。像这样:

    <g:select name="template.id" from="${Template.list()}" optionKey="id" 
              onchange="${remoteFunction(action: 'getProps', 
              params:'\'id=\' + escape(this.value)',
              update: 'props')}"/>
    <div id="props">Properties here</div>
    

    在控制器中,您获取实例并呈现如下属性:

    def getProps() {
        def obj = Template.get(params.id)
        render("""<div id="prop1">prop1 = ${obj.prop1}</div>
                  <div id="prop2">prop2 = ${obj.prop2}</div>
               """)
    }
    

    【讨论】:

    • update: 'props' 表示 id = "props" 的元素将被更新?我可以通过调用remoteFuncion 来更新超过1 个具有不同ID 的元素吗?对不起,我的英语有点不对。
    • 您可以使用"update: [success: 'great', failure: 'ohno']" 根据响应状态在2个元素之间切换,但更新到多个元素同时可能会令人困惑。为什么必须这样做?
    • 我还有一个名为 Cars 的课程。当我创建对象“汽车”时,需要使用来自所选对象的字段值(汽车模型模板)自动设置 4 个 textField 值(它将计算转向轴(1 或 2),每个轮子(2 或 4)上的计数,引导轴的计数(1..5),每个(2 或 4)上的计数轮)。然后,如果用户有非标准汽车(汽车模板中无法描述每个变体),他可以更改此值中的一个或多个并保存对象 Car。
    • 好的,你可以让用户选择一个模板,使用remoteFunction将模板id发送到服务器,服务器用模型的默认值渲染4个textFields。然后,用户可以修改表单中的 textFields 默认值并提交给另一个方法,保存汽车实例。明白了吗?关键是,您不必将所有模型放在一个页面中。
    • 是的。我想在一页中完成所有创建汽车(保存汽车积分)的操作。我不想让用户选择汽车模板,然后提交模板 ID,然后填写汽车的所有其他字段(例如标志、VIN 等),然后再次提交以保存汽车实例。
    猜你喜欢
    • 1970-01-01
    • 2012-07-25
    • 2011-09-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-01-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多