请参阅以下示例代码
var report = {
chartTypes : null,
init: function () {
this.getChartTypes(function(data){
this.chartTypes = data;
});
},
getChartTypes: function(callback) {
$.ajax({
data:'',
url:'',
success:function(response){
chartTypes = JSON.parse(response);
callback(chartTypes);
}
});
},
getToolbar:function() {
this.chartTypes --------------- NULL
}
}
getChartTypes
函数通过AJAX加载不同的图表类型。因此我把它作为回调函数。数据已成功接收。但是当我在this.chartTypes
之类的其他函数中使用getToolbar
时,它表示this.chartTypes
为null
。即使我在首发时也初始化了相同的内容。可能是范围问题。请指教。
答案 0 :(得分:1)
您正在分配一个名为chartTypes
的变量(可能是全局变量),但这与reoprt.chartTypes
不同。您需要分配到this.chartTypes
,但匿名函数中的this
与其外的this
不同,因此您需要使用其他变量记住该值:
getChartTypes: function(callback) {
var self = this;
$.ajax({
data:'',
url:'',
success:function(response){
callback( self.chartTypes = JSON.parse(response) );
}
});
}
答案 1 :(得分:0)
使用OOP方法,大多数开发人员将使用方法并在触发异步成功方法时使用.bind()
来维护适当的范围。这样您就不必担心闭包并使用变量来保持this
的范围。
var report = {
chartTypes : null,
init: function () {
this.getChartTypes();
},
getChartTypes : function(callback) {
$.ajax({
data:'',
url:''
}).done(this._setSuccessResponse.bind(this));
},
_setSuccessResponse : function(data){
this.chartTypes = data;
},
getToolbar : function() {
console.log(this.chartTypes);
}
}
您还需要确保在致电getToolbar
时Ajax呼叫也已完成。