使用带有ajax范围的变量 - 关闭?打回来?

时间:2011-11-23 05:26:44

标签: javascript jquery

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
                    });
                }
            });
        });

3 个答案:

答案 0 :(得分:2)

为什么不起作用

您的代码无法正常工作的问题是,当您的第二个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),

答案 1 :(得分:1)

试试这个解决方案

un = $('#RowSave').val();

希望这能解决您的问题

答案 2 :(得分:0)

您知道有两个user_notes声明?一旦在click内部使用var,再次作为第一个ajax中的参数。第一个保持未定义,第二个仅在使用已定义参数调用success方法时定义。

小心重新定义嵌套作用域中的名称,这很令人困惑。

首先改变,然后如果成功方法的参数值是你想要的,你应该明确地将它保存到变量。

(我个人不会写那个嵌套代码。我可能会使用一个带有变量的对象来存储数据和一个that=this - 引用,并且在ajax成功和失败时使用精简的内联函数包装器调用对象成员方法。我喜欢避免深度嵌套范围,并且需要水平滚动;)