2016-06-28 7 views
1

この関数は、と呼び出されているので、以下のコードは機能しません。 = window。 この = controller.actions.projectを期待していましたが、それ以降はどのようにしてというキーワードが機能しているのかを学びました。そのコンストラクタに渡される関数からのjavascriptオブジェクトのプロパティへのアクセス

BROKEN

controller.actions = { 
     project: new TableauAction("Project", 
      function() { 
       $http.get('/reports/projects/').then(function (response) { 
        this.options = response.data; 
       }); 
      }}; 

以下は、この問題を解決するが、それは非常に洗練され

controller.actions = { 
     project: new TableauAction("Project", 
      function() { 
       var self = controller.actions.project; 
       $http.get('/reports/projects/').then(function (response) { 
        self.options = response.data; 
       }); 
      }}; 

TableauActionオブジェクトワークス:

function TableauAction(name, onChange) { 
this.name = name; 
this.onChange = onChange;} 

私の質問は、それがコンストラクタに渡される関数からオブジェクトのプロパティにアクセスするより洗練された方法があるかどうかです。

+1

はこの..を見て、 "これ" には注意してください:http://stackoverflow.com/questions/4195970/what-does - この - 平均。 javascriptでは、 "this"はその文脈に応じてさまざまな値を取る。あなたの場合、匿名関数の中の "this"とコールバックget関数の中の "this"は、それらの間でまだ異なっています。したがって、あなたは実際に自分自身を宣言しなければなりません。あなたのクラスのプロトタイプ)。 – briosheje

+0

これは、コンストラクタが関数で何をするかによって大きく異なります。 'TableauAction'の定義を教えてください! – Bergi

+0

'self = this'はうまくいくのでしょうか?あなたが渡す関数のコンテキストは何ですか? – Bergi

答えて

1

onChangeコールバックに「this」コンテキストを追加します。

function TableauAction(name, onChange) { 
    this.name = name; 
    this.onChange = onChange; 
    //add this context to your onChange 
    this.onChange.bind(this); 
} 

次にこれに次のように変更します。

controller.actions = { 
     project: new TableauAction("Project", 
      function() { 
       //"this" refers to TableauAction instance now 
       var $this = this; 
       $http.get('/reports/projects/').then(function (response) { 
        //this refers to $http callback response.. 
        $this.options = response.data; 
       }); 
      }}; 
} 
+1

ありがとう! –

関連する問題