Javascript – 如何在对象文字的ajax调用中绑定’this’
我有一个对象文字router
,包含一个ajax调用。 我想在ajax调用中调用this.printMovies()
其他函数,但这引用了ajax对象。
如何逃避它并使其引用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(){ }, }
将context
选项传递给ajax:
$.ajax({ context: this, /* other options */ }
现在在ajax回调中, this
将引用router
对象。
在这种情况下,函数getData
在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(){ } }
绑定整个成功回调绑定它将工作:
(function (response) { if (response && response.length > 0) { this.printMovies(response, callback); } }).bind(this)
一种非常常见的方法是在函数开头将其赋值给局部变量。
var self = this;
然后在你的回调中使用self
而不是:
self.printMovies(response, callback);
您可以使用新的ES6 箭头function ,或绑定 。
您可能必须在success或getData函数上执行此操作
getData : function (url, htmlType, callback) { ... }.bind(this),