在ajax()
函数中使用变量有一些困难。我知道这是因为变量不在ajax()
调用的范围内,但不确定如何解决这个问题。我读过一些关于闭包和回调的内容,但不确定如何将其应用到我的代码中。
代码总结:在click()
上,我通过ajax获得user_notes
,并且在成功的情况下,我弹出一个显示user_notes
的对话框(到目前为止所有这些都有效)。它崩溃的地方是当我然后尝试做另一个ajax调用时,"保存"按钮被按下。在第二个ajax调用中,user_notes
在该范围内是未定义的。
我如何在第二个ajax调用中使用user_notes
?
$(".editSaved").click(function() {
save_id = $(this).attr('id');
var user_notes;
//GET USER NOTES
$.ajax ({
url:"journal-util.php",
data:"q=0&f=user_notes&save_id="+save_id,
success: function(user_notes){
//BUILD SAVE DIALOG
div="<div><textarea rows=15 cols=27 id='RowSave'>"+user_notes+"</textarea></div>";
//AT THIS POINT USER_NOTES HAS A VALUE
success="<div>Updated!</div>";
$(div).dialog({
buttons: {
"Save": function() {
var that = this;
var un = user_notes; //tried this, didn't work
$.ajax ({
url:"journal-util.php",
data:"q=0&f=update&user_notes="+un, //un is empty
success: function(result){
alert(result);
$(that).dialog("close");
//$(success).dialog();
}
})
},
"Cancel": function() {
$(this).dialog("close");
}
},
modal: true,
title: 'Delete',
resizable: false
});
}
});
});
为什么不行
代码不工作的问题是,当第二个AJAX成功回调函数被触发时,user_notes
保存的值可能已经被更改或重置。要使其工作,您需要捕获该作用域中user_notes
的值。
用闭包替换你的"Save"回调函数以保存该范围内的user_notes
值
"Save": function (un) {
return function() {
var that = this;
$.ajax ({
url:"journal-util.php",
data:"q=0&f=update&user_notes="+un,
success: function(result){
alert(result);
$(that).dialog("close");
//$(success).dialog();
}
});
};
} (user_notes),
试试这个方案
un = $('#RowSave').val();
希望这能解决你的问题
您知道您有两个user_notes
声明吗?在click方法内部使用var,在第一个ajax中再次使用var作为参数。第一个方法保持未定义,第二个方法只有在使用已定义的参数调用成功方法时才会定义。
在嵌套作用域中重新定义名称时要小心,这会引起混淆。
先修改它,然后如果success方法的parameter值是你想要的,你应该显式地将它保存到一个变量中。
(我个人不会写嵌套代码。我可能会使用带有变量的对象来存储数据和that=this
引用,并在ajax成功和失败上使用瘦内联函数包装器,仅调用对象成员方法。我喜欢避免深度嵌套作用域,也不喜欢水平滚动;)