使用objects方法作为对AJAX调用的回调

时间:2014-12-12 00:28:55

标签: javascript jquery ajax

我有一个名为Company的javascript对象,可以多次实例化。

我希望每个公司都能处理自己与服务器的通信,以便它的ajax调用将包含在类中。

到目前为止,我有:

Company = new Object();
Company.SendData = function(){
        $.ajax({
            type: "POST",
            url: "<some url>",
            data: <some data>,
            dataType: "json",
            success: this.ReceiveData,
            error: ErrorFunc
        });
}
Company.ReceiveData = function(data){
    alert("Received some data");
}

Ajax工作正常,服务器正确接收数据并返回响应,但回调函数不会触发。

我的猜测是因为它不再具有任何参考框架#34;这个&#34;是

有没有办法让函数附加到类的单个实例?

2 个答案:

答案 0 :(得分:1)

试试这个:

Company.SendData = function(){
 var self = this;
        $.ajax({
            type: "POST",
            url: "<some url>",
            data: <some data>,
            dataType: "json",
            success: function(res) {self.ReceiveData(res);},
            error: ErrorFunc
        });
}

This SO帖子可能有助于理解。

<强>更新

通过封装函数来修复示例。

答案 1 :(得分:1)

如何解决此问题有几种不同的选择。问题的关键在于,在调用回调时,您需要正确设置this的值,因为默认情况下它不会正确。

在现代浏览器中,您可以使用广泛有用的.bind()

Company = new Object();
Company.SendData = function(){
        $.ajax({
            type: "POST",
            url: "<some url>",
            data: <some data>,
            dataType: "json",
            success: this.ReceiveData.bind(this),
            error: ErrorFunc
        });
}
Company.ReceiveData = function(data){
    alert("Received some data");
}

或者,您可以使用context $.ajax()选项指示jQuery为您完成工作:

Company = new Object();
Company.SendData = function(){
        $.ajax({
            type: "POST",
            url: "<some url>",
            data: <some data>,
            dataType: "json",
            context: this,
            success: this.ReceiveData,
            error: ErrorFunc
        });
}
Company.ReceiveData = function(data){
    alert("Received some data");
}

或者您可以使用保存的this值创建自己的存根函数(这是我最不喜欢的选项):

Company = new Object();
Company.SendData = function(){
        var self = this;
        $.ajax({
            type: "POST",
            url: "<some url>",
            data: <some data>,
            dataType: "json",
            success: function(result) {return self.ReceiveData(result);},
            error: ErrorFunc
        });
}
Company.ReceiveData = function(data){
    alert("Received some data");
}