骨干同步覆盖,用查询字符串追加url?

din*_*thy 9 javascript ajax rest jquery backbone.js

我在将一个令牌附加到主干url查询字符串时遇到了一些麻烦,希望你们能在这里帮助我.要知道的三件事,

  • 有一个休息api,每个请求都需要一个令牌
  • 一个执行auth的nginx后端,为/ api下的api提供主干app + proxy req
  • 我是javascript +骨干的新手:/

骨干应用程序实际上从cookie中读取令牌,我需要在每次主干拨打电话时将其附加到请求URL.我看到这可以通过覆盖骨干同步来完成.但它在一些不同的事情上困扰我.就像,这就是我做的

console.log('overriding backbone sync');
var key ="token";
Backbone.old_sync = Backbone.sync
Backbone.sync = function(method, model, options) {
    if (method === 'read') {
        if (!(model.url.indexOf('?key=') != -1)) {
            model.url = model.url + '?key=' + key;
        }
    } else {
        old_url = model.url();
        if (!(old_url.indexOf('?key=') != -1)) {
            model.url = function() {
                return old_url + '?key=' + key;
            }
        }
    }
    Backbone.old_sync(method, model, options);
};
Run Code Online (Sandbox Code Playgroud)

model.url返回一个函数,当它不是一个"读"方法,并且不知道如何处理它,另一个麻烦是当一个连续的请求,令牌被添加两次.我试图用那个没有运气的indexOf东西删除它.

有一个更好的方法吗 ?

mbu*_*ics 14

我认为你根本不需要覆盖sync:

var globalKey = 'key123';

var urlWithKey = function(url, key) {
    return function() {
        return url + "?key=" + key;
    };
};

var MyModel = Backbone.Model.extend({
    url: urlWithKey('/my/url/', globalKey)
});
Run Code Online (Sandbox Code Playgroud)

如果您现在创建一个对象并保存它,my/url/?key=key123则会发送一个POST请求.我猜你也可以覆盖url方法,如果这是你所有Backbone模型所需的行为.

一般说明:在Backbone中大多数参数,例如url可以是函数或值.我不知道为什么在你的例子中它是一次函数而在另一种情况下是一个值,但如果你覆盖一些内部函数,你总是必须能够处理这两种方式.如果你看一下Backbone的源代码,你会看到他们getValue用来访问这些参数:

var getValue = function(object, prop) {
    if (!(object && object[prop])) return null;
    return _.isFunction(object[prop]) ? object[prop]() : object[prop];
};
Run Code Online (Sandbox Code Playgroud)

更新:重载所有模型的url方法可以这样工作:

var globalKey = 'key123';

(function() {
    var baseUrl = Backbone.Model.prototype.url;
    Backbone.Model.prototype.url = function() {
        return this.baseUrl + "?key=" + globalKey;
    };
})()

var MyModel = Backbone.Model.extend({
   baseUrl: '/my/url/'
});
Run Code Online (Sandbox Code Playgroud)

您也可以保留常规的Backbone.Model,并创建自己的基类.有关详细信息,请参阅http://documentcloud.github.com/backbone/#Model-extend.