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

Accessing parent context within a backbone model

本文关键字:上下文 模型 访问      更新时间:2023-09-26

我有一个xhr setRequestHeader,它在Backbone.js中的模型上运行一个方法。当试图使用"this"引用模型的上下文时,它引用的是xhr请求,而不是模型。

在initialize中,我创建了一个名为self的变量,它引用了这个变量,但在sendAuth方法中返回了undefined。

我已经尝试了许多方法来引用sendAuth中的Authentication,但没有成功。如有任何帮助,我们将不胜感激。

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
});

您不必在这里定义"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未定义的原因。在initialize中使用_.bindAll可以确保在调用sendAuth时,sendAuth中的"this"总是指骨干对象。