我有一个包含子函数和对象的函数:
//API load function
var apiDataLoader = function () {
// Set default settings
this.apiSeason = '7924';
this.apiMatchDay = '30';
this.apiType = 'gamelist';
this.apiLink = 'http://example.com/';
this.apiLinkData = {
app: this.apiType,
season_num: this.apiSeason,
match_day: this.apiMatchDay
}
this.apiData = new Object;
//load API
apiDataLoader.prototype.load = function() {
$.ajax({
url: this.apiLink,
data: this.apiLinkData,
success: function(data) {
apiDataLoader.apiData = data; //this is not working
// I need to push somehow responce data to 'apiDataLoader.apiData' object
}
});
}
}
正如您在我的代码中所看到的,我正在尝试将$.ajax
响应推送到名为apidataLoader.apiData
的父函数对象元素,但我无法实现此目的。
有什么想法吗?
P.S:data
值的回复为JSON
对象。
答案 0 :(得分:2)
试试这个:
apiDataLoader.prototype.load = function() {
var self = this; //Store the current object to avoid `this` problem in javascript.
$.ajax({
url: this.apiLink,
data: this.apiLinkData,
success: function(data) {
self.apiData = data; //assign value
}
});
}
答案 1 :(得分:1)
由于在load()
的原型上定义了apiDataLoader
,因此在调用时会收到apiDataLoader
的实例作为上下文,换句话说,this
load()
内的关键字将指向调用它的apiDataLoader
实例,因此您需要将代码更改为此代码:
apiDataLoader.prototype.load = function() {
var that = this; // this is the instance of apiDataLoader on which this method is called
$.ajax({
url: this.apiLink,
data: this.apiLinkData,
success: function(data) {
that.apiData = data; //assign value
}
});
}
答案 2 :(得分:1)
您需要使用apiData
引用当前对象的this
属性,但是您需要将其作为{{1}的范围在$.ajax
成功处理程序之外进行缓存在那个函数中会有所不同。试试这个:
this
答案 3 :(得分:1)
现在你正在构造函数apiDataLoader
上创建一个新属性,而不是当前实例。这是一种方法:
$.ajax({
url: this.apiLink,
data: this.apiLinkData,
dataType: 'json', //will automatically parse the response as JSON
success: function(data) {
this.apiData = data;
},
context: this //sets the context object to the current instance in the callback
});
另外,请注意您的原型函数应该在构造函数之外声明,否则使用原型没有任何优势,因为函数是为每个新创建的实例重新声明的。另外,构造函数以大写字母开头作为JS中的约定,您应该遵循它。
function ApiDataLoader() {
//...
}
ApiDataLoader.prototype = {
constructor: ApiDataLoader,
load: function () {
//...
}
};