我有一些麻烦,向骨干网址查询字符串附加一个令牌,希望你们能帮助我.要知道三件事情,
>有一个休息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.