0

我有下面的代码在javascript中创建一个类....现在我只会传递“网站”的ID,然后通过ajax调用我将从数据库中获取其余信息(JSON ENCODED)。

现在我唯一的问题是,当我在最后看到对象中的内容时,它只显示 id。

ajax 调用工作正常,因为如果我在成功(ajax)后提醒 this.address,它会显示结果。

我认为我无法使用 ajax 请求设置属性......你能帮忙吗?

function website(id) {
     this.id = id; //id


     $.ajax({  //website_information
      type: "GET",
      url: '/proc.php?proc=website_name&id=' + this.id + '',
      success: function(data){
      var tmp = $.parseJSON(data);
     this.address = tmp.website_address;

     this.name = tmp.website_name;
      }
    });

    }

    var obj = new website('20');
    obj.alertwebsite();
    console.log(obj);
4

3 回答 3

5

这里有两个问题。第一个$.ajax是异步的。这意味着它在请求完成之前返回。success函数在请求完成时运行,但obj.alertwebsite()会在之前运行。

第二个问题是thisAJAX 回调中的值。在回调中,this设置为包含 AJAX 调用的所有设置的对象。这意味着您正在此对象上设置addressname属性。有两种方法可以解决这个问题。第一个that = this与其他答案一样。更好的方法是使用contextAJAX 调用中的设置:

function website(id) {
    this.id = id; //id

    $.ajax({ //website_information
        type: "GET",
        url: '/proc.php?proc=website_name&id=' + this.id + '',
        context: this,
        success: function (data) {
            var tmp = $.parseJSON(data);
            this.address = tmp.website_address;

            this.name = tmp.website_name;
        }
    });
}

这允许您自定义this回调内部的含义。这记录在jQuery AJAX 文档中。

于 2012-05-08T11:35:12.920 回答
2

thisAJAX 回调内部可能不是指您的构造函数正在制作的“对象” 。this相反,我们通过将它放在另一个变量中来从外部保留它,比如 say that。然后我们that在 AJAX 回调中使用来引用我们的对象。

function website(id) {
    var that = this; //preserve "this"
    this.id = id;
    $.ajax({
        type: "GET",
        url: '/proc.php?proc=website_name&id=' + this.id + '',
        success: function(data){
            var tmp = $.parseJSON(data);
            that.address = tmp.website_address;  //using "that"
            that.name = tmp.website_name;        //using "that"
       }
    });
}

另外,您是在盲目地打电话,obj.alertwebsite()因为您不知道您的网站信息(that.addressthat.name)是否已加载。

于 2012-05-08T11:33:44.500 回答
1
function website(id) {
    // you need to save "this"
    var self = this;
     this.id = id; //id


     $.ajax({  //website_information
      type: "GET",
      url: '/proc.php?proc=website_name&id=' + this.id + '',
      //async: false, // optionally, if you want to get it back syncronously, so the console.log after the function call will already have the data
      success: function(data){
      var tmp = $.parseJSON(data);
     // you need to use the saved "this"
     self.address = tmp.website_address;

     self.name = tmp.website_name;
      }
    });
}
于 2012-05-08T11:33:37.163 回答