2

我想在 AJAX 调用完成后显示一些 Flash 消息。我正在这样做..

控制器动作——

def subscribe()
{
    def subscribe = new Subscriber()
    subscribe.email = params.subscribe
    if (subscribe.save())
    {
        flash.message = "Thanks for your subscribtion"
    }

}

查看部分——

Subscribe :
    <g:formRemote onSuccess="document.getElementById('subscribeField').value='';" url="[controller: 'TekEvent', action: 'subscribe']" update="confirm" name="updateForm">
       <g:textField name="subscribe" placeholder="Enter your Email" id="subscribeField" />
       <g:submitButton name="Submit" />
    </g:formRemote >
    <div id="confirm">
       <g:if test="${flash.message}">
           <div class="message" style="display: block">${flash.message}</div>
       </g:if>
    </div>

我的 AJAX 工作正常,但没有显示 flash.message。刷新页面后显示消息。如何解决?

4

2 回答 2

7

当您使用 ajax 时,您的页面内容不会被重新解析,因此您的代码:

<g:if test="${flash.message}">
  <div class="message" style="display: block">${flash.message}</div>
</g:if>

不会再次运行。

所以我同意@James 的评论,flash 对你来说不是更好的选择。

如果您需要更新视图,请使用 JSON。Grails 已经有一个转换器可以用于此:

if (subscribe.save()) {
  render ([message: "Thanks for your subscribtion"] as JSON)
}

而你的观点:

<g:formRemote onSuccess="update(data)" url="[controller: 'TekEvent', action: 'subscribe']"  name="updateForm">
  <g:textField name="subscribe" placeholder="Enter your Email" id="subscribeField" />
  <g:submitButton name="Submit" />
</g:formRemote >

<script type='text/javascript'>
  function update(data) {
    $('#subscribeField').val('');
    $('#confirm').html(data.message);
  }
</script>
于 2013-07-29T15:01:52.120 回答
3

您有几个选择,首先您可以尝试以 json 或地图的形式从控制器返回消息,然后使用 javascript 库将其呈现在您自己的屏幕上,如果您想使用 Grails ajax 标签,这有点不同。

另一种选择是使用像one-time-data这样的插件,它

总结“flash”范围的安全替代品,您可以在会话中存储只能读取一次的数据,但只要您具有所需的“id”,就可以在会话的未来任何时候读取。

描述 这个插件提供了一个多窗口安全的闪存范围替代方案,可以推迟访问数据,直到任何未来的请求(只要会话被保留)。 更多的

希望能帮助到你

于 2013-07-29T12:57:04.977 回答