我有一个xhr setRequestHeader,它在Backbone.js中的模型上运行一个方法。当尝试使用“this”引用模型的上下文时,它指的是xhr请求而不是模型。
在initialize中,我创建了一个名为self的变量,引用了这个变量,但它在sendAuth方法中返回undefined。
我已尝试过多种方法在sendAuth中引用身份验证,但没有运气。任何帮助将不胜感激。
var Authentication = Backbone.Model.extend({
initialize: function() {
var self = this;
self.token = Distillery.config.defaultToken;
},
setToken: function(token) {
self.token = token;
},
resetToken: function() {
self.token = Distillery.config.defaultToken;
},
sendAuth: function(xhr) {
xhr.setRequestHeader('Authorization', 'token ' +self.token);
}
});
var authentication = new Authentication;
$.ajaxSetup({
beforeSend: authentication.sendAuth
});
答案 0 :(得分:1)
你不必在这里定义'self'(在你的代码中,'self'只在initialize方法中有用)。
因此,将模型更改为以下内容:
var Authentication = Backbone.Model.extend({
initialize: function() {
_.bindAll(this, 'sendAuth');
this.resetToken();
},
setToken: function(token) {
this.token = token;
},
resetToken: function() {
this.token = Distillery.config.defaultToken;
},
sendAuth: function(xhr) {
xhr.setRequestHeader('Authorization', 'token ' + this.token);
}
});
我相信当你将方法传递给ajaxSetup时,方法的调用者不再是'authentication'而是$ .ajax对象,这就是this.token未定义的原因。在初始化中使用_.bindAll可确保在调用sendAuth时,sendAuth中的“this”始终引用骨干对象。