2016-05-30 45 views
1

裏面我有一個對象字面router,包括Ajax調用。我想在ajax調用中調用其他函數this.printMovies(),但this引用ajax對象。使用Javascript - 如何綁定「這」一個AJAX調用該對象字面

我該如何逃避它並使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

嘗試初始化與'$ =此'this' $ .ajax' Ajax調用DEFN之前的變量。併成功地將路由器obj稱爲'$ this' –

+0

工作正常!這是答案! –

+0

@ViolaT它工作,但作爲一個選項ajax方法...使用'上下文' –

回答

2

通行證context選項AJAX:

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

現在AJAX回調裏面,this將參考router對象。

+0

謝謝。接受答案。 –

0

綁定整個成功回調與綁定它會工作:

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

你的例子中是否有語法錯誤? –

+0

但是'this'甚至在外部作用域中指的是ajax選項,而不是'router'對象 –

+0

我修改了我的答案bind(this)綁定了整個成功回調函數; –

0

您可以使用新的ES6 arrow functions,或bind

你可能不得不這樣做對你的成功或函數的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; 

然後回調內部使用self代替this

self.printMovies(response, callback); 
相關問題