1

我有一个包含子函数和对象的函数:

//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,但我无法实现这一点。

有任何想法吗?

PS:值的响应dataJSON对象。

4

4 回答 4

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
            }
        });
    }
于 2013-10-15T12:51:17.713 回答
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 () {
        //...
    }
};
于 2013-10-15T12:57:47.707 回答
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
        }
    });
}
于 2013-10-15T12:50:51.697 回答
1

您需要使用 引用apiData当前对象的属性this,但是您需要将其缓存在$.ajax成功处理程序之外,因为该函数中的范围this会有所不同。尝试这个:

apiDataLoader.prototype.load = function() {
    var _this = this;
    $.ajax({
        url: this.apiLink,
        data: this.apiLinkData,
        success: function(data) {
            _this.apiData = data;
        }
    });
}
于 2013-10-15T12:53:37.520 回答