3

因此,我创建了一个对象,该对象在初始化阶段进行 AJAX 调用以填充其属性。但是,我遇到了一个非常奇怪的行为:我可以在 $.ajax() 范围内打印并查看属性值,但是任何返回属性值的公共方法的返回值都是“未定义”。

下面是 JS 代码的样子:

function MyFunction() {
   this.myProperty;
   this.init();
}

Myfunction.prototype.getPropertyValue = function () {
    alert(this.myProperty); // returns 'undefined'
}

Myfunction.prototype.init = function () { 
   $.ajax({
      type: 'get',
      url: "getProperty.php",
      dataType: "json",
      success: function(response) {
         this.myProperty = response[0].Property;
         alert(this.myProperty) // returns 'Property Name'
      }
   });
}

我的想法是在 $.ajax() 范围内,“this”实际上是指其他东西。所以,我的问题是如何确保“this.myProperty”已设置并且一旦我们超出 AJAX 范围就不会失去其价值?

任何帮助深表感谢。

4

3 回答 3

4

由于您建立价值的方式,您得到“未定义”的部分原因是:

var MyFunction = function () {
   this.myProperty;
   alert(this.myProperty); // undefined!
   this.init();
};

当您声明属性(或变量)而不指定值时,它们默认为“未定义”。反而:

var MyFunction = function () {
   this.myProperty = false;
   alert(this.myProperty); // false
   this.init();
};

关于ajax调用。你是对的,回调的范围与对象不同。this,在 ajax 成功函数中,指的是 jQuery 包装的 XHR 对象。当您调用 时this.myProperty = response[0].Property,您实际上是在 ajax 对象上创建一个新属性并设置值。要纠正这个问题,您可以使用contextjQuery ajax 对象的选项,或者使用 javascript 方法绑定回调函数bind

  success: function(response) {
     this.myProperty = response[0].Property;
  }.bind(this)

... 或者:

   $.ajax({
      type: 'get',
      url: "getProperty.php",
      dataType: "json",
      context: this,
      success: function(response) {
         this.myProperty = response[0].Property;
      }
   });

在这里试试:http: //jsfiddle.net/SnLmu/

文档

于 2012-08-15T19:05:32.390 回答
0

部分问题是 ajax 是异步的,因此当您尝试访问它们时可能不会设置属性(竞争条件)。另一个是thisajax调用里面的值不是Myfunction。您可以通过以下方式修复:

Myfunction.prototype.init = function () { 
   var that = this;
   $.ajax({
      type: 'get',
      url: "getProperty.php",
      dataType: "json",
      success: function(response) {
         that.myProperty = response[0].Property;
         alert(that.myProperty) // returns 'Property Name'
      }
   });
}

或者您可以使用contextajax 调用中的设置。根据网站

该对象将成为所有与 Ajax 相关的回调的上下文。默认情况下,上下文是一个对象,表示调用中使用的 ajax 设置($.ajaxSettings 与传递给 $.ajax 的设置合并)。例如,将 DOM 元素指定为上下文将使它成为请求完整回调的上下文,如下所示:

Myfunction.prototype.init = function () { 
       var that = this;
       $.ajax({
          type: 'get',
          url: "getProperty.php",
          dataType: "json",
          context: Myfunction,
          success: function(response) {
             this.myProperty = response[0].Property;
             alert(this.myProperty) // returns 'Property Name'
          }
       });
    }
于 2012-08-15T18:58:38.167 回答
0
var MyFunction = {
    myProperty: null,
    init: function() {
        var self = this;
        self.ajax(function(response) {
            self.myProperty = response;
            self.secondfunction(self.myProperty); //call next step only when ajax is complete
        });
    },
    ajax: function(callback) {
        $.ajax({
            type: 'get',
            url: "getProperty.php",
            dataType: "json"
        }).done(function(response) {
            callback(response[0].Property);
        });
    },
    secondfunction: function(prop) {
        alert(prop);
    }
}

$(function() {    
    MyFunction.init();
});
于 2012-08-15T19:04:41.090 回答