1

我正在尝试创建一个从页面返回特定字符串的 ajax 函数,然后将其设置在我创建的类中。但是,当我尝试this.setGlideUser在 ajax 成功参数中调用时,它告诉我

object has no function setUserGlide.

而当我尝试this.setUserGlide在成功参数之外调用,然后查看 的值_glideUser_glideUser是未定义的。这是我的代码片段。

function main()
{
    this.start = true;
}

main.prototype.load = function()
{
    var _glideUser;
    $.ajax(
    {
        url: '/home',
        dataType: 'text',
        success: function(data)
        {
            // Truncated
            _glideUser = unescape(data).match(pattern);
        }
    });
    this.setGlideUser(_glideUser);
    return 1;
}

main.prototype.setGlideUser(user)
{
    return this._glideUser = user;
}

main.prototype.getGlideUser()
{
    return this._glideUser;
}

var _main = new main();
_main.load();
// check that the ajax has completely loaded
_main.getGlideUser(); // returns undefined

我想不出一种方法来_glideUser从 Ajax 成功函数的主类中设置变量。我想_glideUser在另一个函数中获取值,用它来做事。有什么建议么?

4

5 回答 5

3

没有this._glideUser, 因为对于您的功能来说_glideUser是本地的。load与其声明var _glideUserinside load,不如将其设置为构造函数的公共属性:

function main()
{
    this.start = true;
    this._glideUser = null;
}

(您的第一次调用setGlideUser实际上会创建这样一个属性,但同时拥有这两个属性不会令人困惑吗?)

此外,正如其他人所提到的,您正在尝试setGlideUser 您的 ajax 操作完成之前。您需要从success回调中执行此操作:

main.prototype.load = function()
{
    var that = this;
    $.ajax(
    {
        url: '/home',
        dataType: 'text',
        success: function(data)
        {
            that.setGlideUser(unescape(data).match(pattern));
        }
    });
    return 1; // what's the point?
}
于 2012-12-23T21:17:21.030 回答
1

我对 jQuery 不太熟悉,但 ajax 请求可能是异步的,因此您必须从 ajax 成功调用内部调用 setGlideUser,只需向您的实例添加一个引用变量并从那里调用它:

var self = this;
$.ajax(
{
    url: '/home',
    dataType: 'text',
    success: function(data)
    {
        self.setGlideUser(unescape(data).match(pattern));
    }
});

给你一个快速提示是,你可以在 js 中使用 getter 和 setter,如下所示:

main.prototype.__defineSetter__("glideUser", function(value)
{
    this._glideUser = value;
});

main.prototype.__defineGetter__("glideUser", function()
{
    return this._glideUser;
});

编辑:实际上,请参阅那些东西的评论

于 2012-12-23T21:20:21.000 回答
0

success在请求返回之前不会调用。它是异步的。当数据值可用时,您需要在成功本身内调用该方法。

main.prototype.load = function()
{
    var _glideUser, that = this;
    $.ajax(
    {
        url: '/home',
        dataType: 'text',
        success: function(data)
        {
            // Truncated
            var = _glideUser = unescape(data).match(pattern);
            that.setGlideUser(_glideUser);
        }
    });
    // this.setGlideUser(_glideUser); this is incorrect
    return 1;
}
于 2012-12-23T21:19:20.693 回答
0

关键字this表示当前范围,在这种(双关语)情况下是 ajax 对象。您需要通过将我分配给外部对象中的this来引用外部 this对象。

main.prototype.load = function()
 {
    var _glideUser;
    var me = this;
    $.ajax(
    {
        url: '/home',
        dataType: 'text',
        success: function(data)
        {
            // Truncated
            _glideUser = unescape(data).match(pattern);
            me.setGlideUser(_glideUser);
        }
    });
    return 1;
}
于 2012-12-23T21:21:03.373 回答
0

尝试在 ajax 成功参数中调用 this.setGlideUser

那是正确的。但是,success 方法中的this关键字指向 jqXHR 对象而不是您的main实例;你需要取消引用它:

var that = this;
$.ajax({
    url: '/home',
    dataType: 'text',
    success: function(data) {
        _glideUser = unescape(data).match(pattern);
        that.setGlideUser(_glideUser);
    }
});
于 2012-12-23T21:29:09.680 回答