访问骨干模型中的父上下文

时间:2013-11-20 00:51:40

标签: javascript backbone.js xmlhttprequest

我有一个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
});

1 个答案:

答案 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”始终引用骨干对象。