Javascript Backbone.js解析未修改响应
我有一个与头ETag一起工作的服务器。主干是指API的第一次:一切都很好,收到的响应和解析。第二次:主干发送到服务器ETag,响应接收NotModified。主干试图解析这个响应,结果产生了一个称为reset的集合 有没有办法重置集合 在fetch方法中添加要添加的选项的方法将不起作用。因为我需要完全刷新集合,如果我访问服务器的响应Javascript Backbone.js解析未修改响应,javascript,caching,jquery,backbone.js,etag,Javascript,Caching,Jquery,Backbone.js,Etag,我有一个与头ETag一起工作的服务器。主干是指API的第一次:一切都很好,收到的响应和解析。第二次:主干发送到服务器ETag,响应接收NotModified。主干试图解析这个响应,结果产生了一个称为reset的集合 有没有办法重置集合 在fetch方法中添加要添加的选项的方法将不起作用。因为我需要完全刷新集合,如果我访问服务器的响应 var recommendCollection = Backbone.Collection.extend({ model : Event, etag
var recommendCollection = Backbone.Collection.extend({
model : Event,
etag : null,
urlRoot : '/api/users',
initialize: function() {
this.etag = null;
},
parse: function(response) {
return response.data;
},
url : function () {
return (this.urlRoot + "/"+window.me.get('id')+ "/recommendation");
},
beforeSend : function (jqXHR, settings) {
jqXHR.setRequestHeader('if-none-match', this.etag);
},
complete : function (jqXHR, textStatus) {
if (jqXHR.status == 200 || jqXHR.status == 304) {
this.etag = jqXHR.getResponseHeader('ETag');
}
},
update : function () {
this.fetch({
beforeSend : this.beforeSend.bind(this),
complete : this.complete.bind(this),
data : {
cityId : window.me.get('cityId'),
}
});
}
据我所知,没有简单的解决方案可以捕获304响应。我想到的是:
接收,解析
,您可以使用该选项检查请求的状态,并在必要时使用相同的模型重新填充您的收藏。它可以工作,但会触发选项
重置
parse: function(response, options) { if (options.xhr.status === 304) return this.models return response.data; }
- jQuery接受一个
选项,该选项可能对您有所帮助 如果修改默认值:false 仅当响应已更改时才允许请求成功 自从上次请求以来。这是通过检查上次修改的 标题。默认值为false,忽略标题。在jQuery1.4中 此技术还检查服务器指定的要捕获的“etag” 未修改的数据ifModified
- 或在304响应时覆盖以停止
fetch: function(options) { options = options ? _.clone(options) : {}; if (options.parse === undefined) options.parse = true; var collection = this; var success = options.success; options.success = function(resp, status, xhr) { if (xhr.status!==304) collection[options.add ? 'add' : 'reset'](collection.parse(resp, xhr), options); if (success) success(collection, resp); }; options.error = Backbone.wrapError(options.error, collection, options); return (this.sync || Backbone.sync).call(this, 'read', this, options); }
很抱歉,我回答得太匆忙了,我的话在这里没有帮助。文档不断发展,第二个参数是,并且是将包含
xhr
的options
对象。第一个解决方案需要更改为parse:function(response,options){if(options.xhr.status==304)returnthis.models return response.data;}
@flochtilliloch谢谢您提供的信息,我更新了我的答案