javascript – 骨干同步覆盖,追加URL与查询字符串?

我有一些麻烦,向骨干网址查询字符串附加一个令牌,希望你们能帮助我.要知道三件事情,

>有一个休息api,期望每个请求一个令牌
>执行auth的Nginx后端服务于/ api下的api的骨干应用程序代理请求
>我是一个新的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,options);
};

当它不是“读取”方法时,model.url正在返回一个函数,并且不知道如何处理它,另一个问题是当连续请求被创建时,令牌被添加两次.我试图删除它与该indexOf东西没有运气.

有没有更好的方法来做到这一点?

解决方法

我不认为你根本不需要重写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)
});

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

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

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

更新:重载所有型号的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/'
});

你也可以按常规离开Backbone.Model,并创建自己的基类.详见http://documentcloud.github.com/backbone/#Model-extend.

相关文章

前言 做过web项目开发的人对layer弹层组件肯定不陌生,作为l...
前言 前端表单校验是过滤无效数据、假数据、有毒数据的第一步...
前言 图片上传是web项目常见的需求,我基于之前的博客的代码...
前言 导出Excel文件这个功能,通常都是在后端实现返回前端一...
前言 众所周知,js是单线程的,从上往下,从左往右依次执行,...
前言 项目开发中,我们可能会碰到这样的需求:select标签,禁...