如何从jQuery.ajax成功语句中推送父对象

时间:2013-10-15 12:45:57

标签: javascript jquery ajax oop

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

//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对象。

4 个答案:

答案 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 () {
        //...
    }
};