1

ページから特定の文字列を返し、作成したクラスに設定する ajax 関数を作成しようとしています。this.setGlideUserただし、 ajax 成功パラメーター内で呼び出そうとすると、

object has no function setUserGlide.

this.setUserGlideまた、success パラメーターの外側で呼び出しを試みてからの値を見ると_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

_glideUserAjax の成功関数からメイン クラス内に変数を設定する方法が思い浮かびません。_glideUser別の関数内での値を取得して、それを処理したいと考えています。助言がありますか?

4

5 に答える 5

3

関数に対してローカルthis._glideUserであるため、はありません。内部で宣言する代わりに、コンストラクターからパブリック プロパティとして設定します。_glideUserloadvar _glideUserload

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

(最初に を呼び出すと、setGlideUser実際にはそのようなプロパティが作成されますが、両方を使用すると混乱しませんか?)

また、他の人が述べたように、ajax操作が完了するsetGlideUser 前にしようとしています。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 でゲッターとセッターを使用できるということです。

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

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

編集:実際には、そのようなコメントを参照してください

于 2012-12-23T21:20:21.000 に答える
0

キーワードthisは、現在のスコープを意味します。これは、この (しゃれを意図した) ケースでは ajax オブジェクトです。外部オブジェクトのthisにmeを割り当てることにより、外部の 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

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

ajax 成功パラメーター内で this.setGlideUser の呼び出しを試みます

それは正しかった。ただし、success メソッドのthisキーワードmainは、インスタンスではなく jqXHR オブジェクトを指しています。逆参照する必要があります。

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 に答える