微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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.

原文地址:https://www.jb51.cc/js/152287.html

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐