我有一个AJAX函数,当我点击一个复选框时会调用它。通常它会打开或关闭我页面的一部分。这很好,但是当发生错误时,即。在某些情况下,不允许单击复选框,我想通知AJAX这不成功。
我也不知道如何修复错误信息以显示在闪存消息使用的相同位置。
如果我使用flash消息,我需要再次重定向到同一页面然后我将页面放在其中并且那不太好。
我确信这应该是这个b的常见解决方案,因为我认为这是一个常见的情况或者......?
这就是在这种情况下使用的控制器部分:
def useWeeklyVolumes() {
println("useWeeklyVolumes - params: "+params)
def od = OfferDetail.get(params.id)
String status = od.offerHeader.status
if ((status == 'Sold') || (status == 'Rejected')) {
transactionStatus.setRollbackOnly()
return render(status: 400, text:"Offer can not be changed (Sold/Rejected)")
}
这就是AJAX调用的样子。
$(document).ready(function(){
$( document ).on('change', '.useWeeklyVolumes', function ( event ){
$.ajax({
url: '${g.createLink( controller:'offerDetail', action:'useWeeklyVolumes' )}',
data: {ckbWeeklyVolumes:this.checked, id:this.id},
type: 'get',
success: function ( data ) { $( '#nono' ).html( data ); },
error: function (jqXHR) {document.querySelector('#alert').innerHTML = jqXHR.responseText;
const timeoutID = window.setTimeout(() => {
messageBox.innerHTML = '';
window.clearTimeout(timeoutID);
}, 3000);}
});
});
});
这是我最近的尝试:
<script>
$(document).ready(function(){
$( document ).on('change', '.batman', function ( event ){
alert('Hej');
$.ajax({
url: '${g.createLink( controller:'person', action:'register' )}',
data: {registered:this.checked, id:this.id},
type: 'get',
success: function ( data ) { $( '#alert' ).html( data ); },
error: function (jqXHR) {const alert = document.querySelector('#alert').innerHTML = jqXHR.responseText;
const timeoutID = window.setTimeout(function() {
alert.innerHTML = '';
window.clearTimeout(timeoutID);
}, 3000);}
});
});
});
</script>
在gsp中我添加了这个:
<span id="alert"></span>
此处显示错误消息,但在我刷新之前它会一直存在。
最终解决方案:
<script>
$(document).ready(function(){
$( document ).on('change', '.batman', function ( event ){
$.ajax({
url: '${g.createLink( controller:'person', action:'register' )}',
data: {registered:this.checked, id:this.id},
type: 'get',
success: function ( data ) { $( '#alert' ).html( data ); },
error: function (jqXHR) {const alert = document.querySelector('#alert');
alert.innerHTML = jqXHR.responseText;
const timeoutID = window.setTimeout(function() {
alert.innerHTML = '';
window.clearTimeout(timeoutID);
}, 3000);
}
});
});
});
具有单独错误功能的替代解决方案:
<script>
$(document).ready(function(){
$( document ).on('change', '.batman', function ( event ){
$.ajax({
url: '${g.createLink( controller:'person', action:'register' )}',
data: {registered:this.checked, id:this.id},
type: 'get',
success: function ( data ) { $( '#alert' ).html( data ); },
error: function (jqXHR) {displayAlertMessage(jqXHR.responseText)}
});
});
});
function displayAlertMessage(message) {
var timeOut = 5
jQuery('#alert').text(message).fadeIn()
jQuery('#alert').css("display", "block")
setTimeout(function() {
jQuery('#alert').fadeOut()
jQuery('#alert').css("display", "none")
}, timeOut * 1000);
}
</script>
答案 0 :(得分:1)
您使用短信和状态代码400致电render
,以便执行javascript'错误:'代码。
http://docs.grails.org/3.1.x/ref/Controllers/render.html
答案 1 :(得分:1)
如果您尝试在显示Flash消息的同一div中显示错误消息并假设div具有警报ID,则可以执行以下操作
x <- round(rgamma(100,shape = 0.5,rate = 10),1)
hist(x)
这应该进入错误函数,该函数最多接受三个参数,如文档http://api.jquery.com/jquery.ajax/中所示
这将显示您从数据中获得的消息,3秒后将删除它。
正如@bassmartin所提到的,您可以在控制器中使用render方法创建特定消息并定义状态。或者,如果您使用高于2.3的grails版本,则可以使用respond。
在使用响应的第一个版本上我不是很清楚,如果您决定选择该选项,请首先阅读您的版本的文档