0

javascriptでクラスを作成するための以下のコードがあります....今、私は「ウェブサイト」のIDのみを渡し、次にajax呼び出しを介して、データベースから残りの情報を取得します(JSON ENCODED)。

今私の唯一の問題は、最後にオブジェクトの内容を見ると、IDのみが表示されることです。

成功(ajax)後にthis.addressをアラートすると、結果が表示されるため、ajax呼び出しは正常に機能します。

私が推測するのは、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

ここには 2 つの問題があります。1 つ目は、$.ajax非同期であることです。つまり、リクエストが完了する前に返されます。success関数はリクエストが完了すると実行されますが、それobj.alertwebsite()より前に実行されます。

2 番目の問題はthis、AJAX コールバック内の の値です。コールバック内でthis、AJAX 呼び出しのすべての設定を含むオブジェクトに設定されます。これは、このオブジェクトのプロパティを設定addressしていることを意味します。nameこれには 2 つの方法があります。最初はthat = this他の回答と同じです。より良い方法はcontext、AJAX 呼び出しで設定を使用することです。

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

AJAXコールバックのthis内部は、コンストラクターが作成している「オブジェクト」を参照していない可能性があります。代わりに、thissay のように別の変数に入れて、外部からを保持しますthat。次にthat、AJAX コールバックで object-to-be を参照するために使用します。

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 に答える