$ .Ajax Success调用原型函数错误

时间:2012-10-08 17:23:30

标签: javascript ajax

  

可能重复:
  $(this) inside of AJAX success not working

我有以下示例代码(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”,因此请阻止其网站上出现“访问控制 - 允许 - 来源”错误。

执行此代码时,出现以下错误:

未捕获的TypeError:对象#没有方法'UpdateData'

如果你执行JSFiddle,你会发现当调用PrePopulate时,它会在函数的开头运行this.UpdateData()就好了。但是一旦完成Ajax调用,就会出现错误。

为什么会发生这种情况?也许我正以错误的方式接近这一点。任何见解都会有所帮助。

这是我的JSFiddle:http://jsfiddle.net/B4NRY/2/

1 个答案:

答案 0 :(得分:8)

您使用AdvancedSearch的实例作为上下文($.ajax)不会调用您对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();
        }
    });
}