2

重複の可能性:
$(this) 内部の AJAX 成功が機能しない

私は次のサンプルコードを持っています(フォローするJSFiddle)

AdvancedSearch = function() {
    this.current = 'test';
}

AdvancedSearch.prototype.InitPage = function() {
    var t = this.current;
    this.PrePopulate()

}

AdvancedSearch.prototype.UpdateData= function() {
    alert(this.current);
}

AdvancedSearch.prototype.PrePopulate = function() {
    this.UpdateData();

    $.ajax({
        url: 'http://fiddle.jshell.net/',
        success: function(msg) {
            this.UpdateData();
        }
    });
}

var as = new AdvancedSearch();
as.InitPage();​

そこに「http://fiddle.jshell.net」があるので、サイトで Access-Control-Allow-Origin エラーが発生しないようにします。

このコードを実行すると、次のエラーが発生します。

キャッチされていない TypeError: オブジェクト # にはメソッド 'UpdateData' がありません

JSFiddle を実行すると、PrePopulate が呼び出されると、関数の先頭で this.UpdateData() が正常に実行されることがわかります。しかし、Ajax 呼び出しが終了するとすぐに、エラーが発生します。

なぜこれが起こっているのかについて何か考えはありますか?おそらく、私はこれに間違った方法でアプローチしています。どんな洞察も役に立ちます。

ここに私の JSFiddle があります: http://jsfiddle.net/B4NRY/2/

4

1 に答える 1

8

指定したコールバック$.ajaxは、AdvancedSearch のインスタンスをコンテキスト ( this) として使用して呼び出されません。

解決策 1 (すべての同様のコールバックの問題に有効):

AdvancedSearch.prototype.PrePopulate = function() {
    this.UpdateData();
    var that = this; // register the that variable in the closure of the callback
    $.ajax({
        url: 'http://fiddle.jshell.net/',
        success: function(msg) {
            that.UpdateData();
        }
    });
}

解決策 2 ( $.ajaxに固有ですが、非常にクリーンです。Felix に感謝します):

AdvancedSearch.prototype.PrePopulate = function() {
    this.UpdateData();
    $.ajax({
        url: 'http://fiddle.jshell.net/',
        context: this,
        success: function(msg) {
            this.UpdateData();
        }
    });
}
于 2012-10-08T17:24:38.413 に答える