我想在完成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。刷新页面后显示消息。怎么解决?
答案 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
希望有所帮助