2016-05-30 12 views
1

私はオブジェクトリテラルrouterを持っており、ajax呼び出しを含んでいます。私は他の関数this.printMovies()をajax呼び出しの中で呼び出したいが、thisはajaxオブジェクトを参照する。Javascript - オブジェクトリテラルへのajax呼び出しの中で 'this'をバインドする方法

thisはどのようにしてエスケープしてrouterオブジェクトを参照していますか?全体の成功コールバックのバインドとそれが動作します

var router = { 

    //... 
    init : function() { 
     this.getData("api/movies", "movies", callback); 
    }, 
    getData : function (url, htmlType, callback) { 
     $.ajax({ 
      url: url, 
      dataType: 'json', 
      success: function (response) { 
       if (response && response.length > 0) { 
        this.printMovies(response, callback); //'this' refers to ajax 
        this.printMovies(response, callback).bind(this) //still doesn't work 
       } 
      }, 
      error: function (response) { console.log("Error:" + response); } 
     }); 
    }, 
    printMovies : function(){ 

    }, 
} 
+0

これは '$ .ajax' AJAXコールDEFN前this'を=' $で変数を初期化してみます。成功したルータのobjを '$ this'と呼んでください –

+0

これは機能します!これが答えです! –

+0

@ViolaTこれはオプションとしてAJAXメソッドを使用できます。コンテキストを使用してください。 –

答えて

2

パスcontextオプションアヤックスへの上でこれを行うために必要がある場合があります。

+0

ありがとうございます。回答が受け入れられました。 –

0

バインド:

(function (response) { 
      if (response && response.length > 0) { 
       this.printMovies(response, callback);          } 
     }).bind(this) 
+0

あなたの例で構文ミスがありますか? –

+0

しかし、 '外側のスコープでさえ' this 'は 'router'オブジェクトではなくajaxオプションを参照しています。 –

+0

私は自分の答えを変更しました。 –

0

は、新しいES6 arrow functions、またはbindを使用することができます。

$.ajax({ 
    context: this, 
    /* other options */ 
} 

今すぐAJAXコールバックの内側に、 thisrouterオブジェクトを参照します:

あなたはあなたの成功かのgetData機能

getData : function (url, htmlType, callback) { 
    ... 
}.bind(this), 
+0

私の例では 'this.printMovies(response、callback).bind(this)'を試してみることができますが、動作しません。 –

+1

'this.printMovies.bind(this、response、callback)' 成功の関数でそれをしなければならないかもしれない – Kruga

+0

いいえ、 'this'は' router'オブジェクトではありませんが、ajaxオプションオブジェクト –

1

この場合、関数getDataは、親オブジェクトのコンテキストをthisというキーワードで保持します。だからあなたができることは、thisの参照をいくつかの変数に格納し、後でそれを使用することです。以下のように:

var router = { 

    //... 
    init : function() { 
     this.getData("api/movies", "movies", callback); 
    }, 
    getData : function (url, htmlType, callback) { 
     var mainObj = this; // line to be noticed 

     $.ajax({ 
      url: url, 
      dataType: 'json', 
      success: function (response) { 
       if (response && response.length > 0) { 
        // parent object to be used 
        mainObj.printMovies(response, callback); //'this' refers to ajax 
       } 
      }, 
      error: function (response) { console.log("Error:" + response); } 
     }); 
    }, 
    printMovies : function(){ 

    } 
} 
0

非常に一般的なアプローチは、あなたの関数の先頭でローカル変数にthisを割り当てることです。

その後
var self = this; 

代わりthisのコールバックを使用self内側:

self.printMovies(response, callback); 
関連する問題