在我的基于Backbone.js的应用程序中,我正在与我的API进行通信,它响应204状态和空体,以防请求集合但不包含任何数据。在我看来,RESTful API在这种情况下应该如何响应。
在我的应用程序中,我遇到了问题,显然在收到204响应后没有触发任何事件。我试图将reset
和all
绑定为:
FoosCollectionView.prototype.initialize = function() {
this.collection = new FoosCollection;
this.collection.bind('reset', this.render, this);
this.collection.bind('all', this.render, this);
return this.collection.fetch();
};
但事件永远不会发生。所以我试着给fetch一些回调:
FoosCollectionView.prototype.initialize = function() {
this.collection = new FoosCollection();
return this.collection.fetch({
success: function(a, b, c) {
debugger;
},
error: function(a, b, c) {
debugger;
},
complete: function(a, b) {
debugger;
}
});
};
同样的行为。如果响应是204,则不会达到调试语句。如何处理204响应呢?我是否需要深入研究sync
并为204添加额外的处理,或者Backbone中有什么东西我还不知道呢?
Thx Felix
答案 0 :(得分:0)
解决方案似乎同时非常前瞻和尴尬:
我只是在我的集合中定义parse
方法,以便检查传递的响应对象是否为空。这只是204发生的情况。然后在parse
内设置this.collection.models = []
,触发reset
事件。集合视图绑定到该事件,运行一个可以查看this.collection.models
内部的函数。如果没有给出模型,则可以呈现“无内容”模板而不是标准模板。
如果有人有更好的方法,我会很感激!
答案 1 :(得分:0)
Backbone.js将此类响应包装到空集合中。我使用它作为解决方法。
render: function(){
if (this.collection.length == 0) {
console.log('empty response');
// initialize with default values
this.collection.reset(data);
}
// do usual stuff
}
答案 2 :(得分:0)
今天也出现了同样的问题,从结论来看,我的代码错了。
修改代码后,当服务器以success()
响应时,会调用204 No Content
回调。
骨干:1.2.3
jQuery:2.1.4
代码错误:
FooCollection = Backbone.Collection.extend({
url: '/foo',
model: FooModel,
fetch: function (options) {
// do something.
// Actually, you should call `Backbone.Collection.prototype.fetch()`.
return Backbone.Model.prototype.fetch.call(this, options);
}
});
因此,如果您遇到此问题,则应检查代码中是否有任何错误。
无论如何,如果你想处理204 No Content
响应,有以下方法。 (不推荐)
initialize: function() {
this.collection = new FooCollection();
var _this = this;
this.collection.fetch({
success: function (collection, response, options) {
},
error: function (collection, response, options) {
}
}).done(function (data, textStatus, jqXHR) {
if (jqXHR.status === 204) {
// do something.
// e.g. _this.collection.reset();
}
});
}