如何从AJAX内部更改外部变量?

时间:2010-06-17 13:55:31

标签: javascript jquery ajax tags

我继续遇到这两个问题。我一直在尝试使用Remy Sharp精彩的tagSuggest插件,效果很好。直到我尝试使用AJAX调用从我的数据库中获取标签。

我的setGlobalTags()效果很好,我在函数顶部定义了myTagList。我想要做的是将myTagList设置为等于我的AJAX的结果。我的问题是我既不能从我的成功或错误函数中调用setGlobalTags(),也不能实际改变原来的myTagList。

此外,我还继续讨论这个问题。我将此代码保存在我的母版页中,而我的AJAX几乎在每个页面都返回“成功”。当我导航到实际包含id="ParentTags"某些内容的页面时,我只会(并且始终)收到错误提醒。我不明白为什么会发生这种情况,因为我的$('#ParentTags').tagSuggest();肯定是在我的AJAX调用之后。

我意识到这可能只是一些愚蠢的约定错误,但我是新手,我在这里向你们学习。提前谢谢!

$(function() {
        var myTagList = ['test', 'testMore', 'testALot'];

        $.ajax({
            type: "POST",
            url: 'Admin/GetTagList',
            dataType: 'json',
            success: function(resultTags) {
                myTagList = resultTags;
                alert(myTagList[0]);

                setGlobalTags(myTagList);
            },

            error: function() { 
                alert('Error');
                setGlobalTags(myTagList);
            }
        });

        setGlobalTags(myTagList);

        $('#ParentTags').tagSuggest();
    });

3 个答案:

答案 0 :(得分:0)

实际上,在 AJAX调用之前,您对$('#ParentTags').tagSuggest();的调用将发生。在AJAX调用完成之前和调用$.ajaxerror函数之前,success函数立即返回。所以你需要在AJAX调用之后将你想做的任何事情移动到成功/错误函数中。

$(function() {
        $.ajax({
            type: "POST",
            url: 'Admin/GetTagList',
            dataType: 'json',
            success: function(resultTags) {
                setGlobalTags(resultTags);
                $('#ParentTags').tagSuggest();
            },

            error: function() { 
                //...
            }
        });
    });

对于问题的第二部分,请尝试查看从服务器获取的响应,以帮助追踪错误:

error : function(xhr) {
    alert(xhr.status);
    alert(xhr.responseText);
    //you can use console.log instead of alert if using firebug
}

答案 1 :(得分:0)

检查从服务器传递的数据类型。如果是JSON数组,则需要使用eval或$ .parseJSON来获取标记并将它们设置为全局标记。因此,如果您返回一个数组,您的代码将是这样的。

$(function() {
        var myTagList = ['test', 'testMore', 'testALot'];

        $.ajax({
            type: "POST",
            url: 'Admin/GetTagList',
            dataType: 'json',
            success: function(resultTags) {
                myTagList = eval(resultTags);
                alert(myTagList[0]);

                setGlobalTags(myTagList);

                $('#ParentTags').tagSuggest();
            },

            error: function() { 
                alert('Error');
                setGlobalTags(myTagList);

                $('#ParentTags').tagSuggest();
            }
        });


    });

答案 2 :(得分:0)

我在问题的前半部分使用了interjay的答案(我接受的答案)。为了让我的AJAX在我需要的页面上正确运行,我只是将相对URL从'Admin / GetTagList'更改为'GetTagList',因为我的页面已经在'Admin'控制器下。