如何在AJAX调用后在Grails中显示flash.message

时间:2013-07-29 09:25:10

标签: ajax grails grails-2.0

我想在完成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。刷新页面后显示消息。怎么解决?

2 个答案:

答案 0 :(得分:7)

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

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

不会再次运行。

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

如果您需要更新视图,请使用JSON。 Grails已经有converter可用于此:

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>

答案 1 :(得分:3)

你有两个选择, 首先,您可以尝试以json或map的形式从控制器返回消息,并使用javascript库在屏幕上呈现它,如果您想使用Grails ajax标签,则会有所不同。

另一个选项是使用像one-time-data这样的插件,

  

摘要安全地替换存储数据的“flash”范围   会话只能读取一次,但在任何一点上都可以读取   如果你需要“id”,那么会议的未来。

     

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

希望有所帮助