我有以下示例代码(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/
答案 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();
}
});
}