1

我是 Grails 的新手,g:formRemote 命令遇到了一些问题。

我希望 ag:textArea 框向我的控制器发送消息并保存此消息。之后,应该通过formRemote Ajax更新页面,以便消息出现在页面上。

但是 formRemote 调用不是更新页面,而是假定给定的 url 是一个真正的链接,并希望我重定向到这个(不存在的).jsp 站点。
我想开始的方法在我的控制器中被调用

我尝试了许多在类似问题中提供的解决方案,但似乎这个问题与他们的不同

继承人的代码:

<div id="history">
    <g:render template="posts" collection="${ messages }" var="message" />
</div>
<div class="postMessageForm">
    <g:formRemote name="postChatMessage" url="[controller: 'meetingRoom', 
                  action: 'postMessage']" update="history">                             
    <div class="msg_box">
        <g:textArea name="message" value="" style="width: 630px"/><br/>
    </div>
    <div style="float: right;">
        <g:submitButton name="Send" style="width: 90px; height: 40px;"/>
    </div>
    </g:formRemote>
</div>

这是在我的 MeetingRoomController 中调用的 Action:

def postMessage() {
if (params.message != "") {
    def thisUser = lookUpUser()
    def thisRoom = thisUser.joinedRoom
    def chatPost = new ChatPost(
        message: params.message,
        author: thisUser
    )
    thisRoom.addToChatHistory(chatPost)
}
//  def messages = currentChatHistory()
//  render template: 'posts', collection: messages, var: 'message'

我在 Jeff Browns Twitter 教程中看到了这种方法。

我看到的可能失败:

  • 注释掉的渲染模板命令与 Ajax 有关(当我不评论它时,唯一发生的事情是模板帖子将在重定向页面上呈现
  • Ajax 和 jQuery 的使用(但我不相信这可能是重点,因为我只使用了 g: 和 groovy 的东西,甚至还没有导入 jQuery 库)
  • 使用 remoteFunction 可能会更容易(在这种情况下,我真的不知道如何让 remoteFunction 工作)

我希望这些信息足以让别人看到我错过了什么

4

1 回答 1

1

当在您的表单上单击提交按钮时,数据将发送到 formRemote 标记的 url 参数中列出的方法。然后您在该方法中,您会看到注释掉的渲染标记,该标记将数据输出回在 formRemote 标记的更新标记中提到的 div 中的 gsp 页面。

formRemote 依赖于 javascript 库来处理 grails 文档中提到的 ajax 内容:

7.7.1 Ajax 支持

默认情况下,Grails 附带 jQuery 库,但通过插件系统提供对其他框架的支持,例如 Prototype、Dojo:http://dojotoolkit.org/、Yahoo UI:http://developer.yahoo.com/yui/ 和谷歌网络工具包。本节概括介绍 Grails 对 Ajax 的支持。要开始,请将此行添加到页面的标记中:

您可以将 jQuery 替换为您已安装的插件提供的任何其他库。这是因为 Grails 支持自适应标签库。由于 Grails 的插件系统支持许多不同的 Ajax 库,包括(但不限于):

jQuery Prototype Dojo YUI MooTools

所以删除历史 div 中的内容,取消注释 postMessage 方法中的两行,并包含引用的 javascript 库之一。

于 2012-07-07T19:44:21.853 回答