2011-04-20 24 views
0

:内部関数が実行されたときにthisは私の物ではないので、今jQueryのAjaxとオブジェクトフィールド

MyObject = function(){ 
    this.field = null; 

    this.build = function(){ 
     var my_url = "..."; 
     var my_data = "..."; 
     $.get(my_url, my_data, function(result){ 
      this.field = result; 
     }); 
    } 

    this.get = function(){ 
     return this.field; 
    } 
} 

object = new MyObject(); 
object.build(); 
my_result = object.get() 

my_resultnullです。
$.getの戻り値でthis.fieldを設定するにはどうすればよいですか?あなたのコンストラクタの上で

+1

_please_あなたのオブジェクト 'Object'を呼び出さないでください! – Alnitak

+0

@Alnitak ok私はMyObjectを呼び出します... – bicccio

答えて

1

、ん:

var self = this; 

これは現在のオブジェクトを参照する新しいスコープ変数を作成します。

はその後AJAX呼び出しに戻って実行します。

self.field = result; 
+0

'this.build'メソッドの中で、' object.build.apply(scope、...) 'が中断しないようにすることをお勧めします。実際に – Raynos

+0

が重要なのであれば、私はおそらく両方を行うだろう。 – Alnitak

1
MyObject = function(){ 
    this.field = null; 

    this.build = function(cb){ 
     var my_url = "..."; 
     var my_data = "..."; 
     var self = this; 
     $.get(my_url, my_data, function(result){ 
      self.field = result; 
      cb(result); 
     }); 
    } 

    this.get = function(){ 
     return this.field; 
    } 
} 

object = new MyObject(); 
object.build(function(field) { 
    console.log(object.get() === field); 
}); 

を私はあなたがすぐあなたのフィールドが設定されているときに通知することができますので、あなたのビルド機能へのコールバックを渡しお勧めします。

また、var self = thisをメソッド内に配置すると、object.build.call(scope, f)を間違った範囲にバインドせずに呼び出すことができます。

このパターンは、別のクラスのメソッドを呼び出す場合に継承に特に役立ちます。将来的には

+0

plsはスコープの問題を精緻化しています。具体的には、構築されたオブジェクト自体のスコープとは異なるスコープを使用したいとお考えですか? – Alnitak

+0

@Alnitakあなたはそれを再利用したいかもしれません。そのOOPパターン – Raynos

1

、モジュール・パターンを使用してみてください:

はHERE MODULEのパターンです:

<script type="text/javascript"> 
    var myNamespace = (function($) { 
     var publicInstances = {}; 

     // *********************** 
     // myObject 
     publicInstances.myObject = myObject; 
     function myObject() { 

      /// <summary>A pointer to this</summary> 
      var self = this; 

      this.someProperty = new String(); 

      this.initialize = function() { 
       /// your code here 
      } 
      this.someMethod = function() { 
       /// your code here 
      } 

      self.initialize(); 
     } 

     return publicInstances; 
    })(jQuery); 


    jQuery(document).ready(function() { 
     // Use would look like 
     var myInstance = new myNamespace.myObject(); 
    }); 
</script> 

HEREは、オブジェクトがどのように見えるかです:

var myNamespace = (function($) 
{ 
    var publicInstances = {}; 

    // *********************** 
    // myObject 
    publicInstances.myObject = myObject; 
    function myObject(url, data) { 

     /// <summary>A pointer to this</summary> 
     var self = this; 
     /// <summary>Contains the result</summary> 
     this.field = null; // Name this result instead. 

     this.url = url; 
     this.data = data; 

     this.initialize = function() { 
      /// Initialize whatever 
     } 
     this.build = function() { 
      $.get(self.url, self.data, function(result) { 
       self.field = result; 
       cb(self.field); 
      }); 
     } 
     this.cb = function(result) { 
      /// Do whatever 
     } 

     self.initialize(); 
    } 

    return publicInstances; 
})(jQuery); 
+0

そのパターンは少し工夫されており、それほど良いものではありません。それでもグローバルスコープに漏れています。非同期ローダに自分自身を開かないようにします。しかし、それはちょうどちょうど特別なコーディングです! – Raynos

+0

グローバルスコープに「漏れた」ということを私は見ません。あなたが永続的なオブジェクトを作成することを意味する場合...私はそれが悪いとは思わない。実際、それはまさに彼がやりたいことです。これはどうですか?あなたがそれが好きではない場合は、より良い選択肢を投稿してください? –

+0

さらに、Module Patternは広く使用されています...そして、私はJohn Resigの例から得ました! –