我正在为两件事寻找更好的解决方案:
我如何了解数据是否已获取并准备就绪,我使用
BasicDealList.on("reset", function(){})
了解数据是否从 ajax 获取并已解析并准备好使用,但感觉很脏。如果一个空的 JSON 来自
{}
之类的提取,它仍然显示 BasicDealList.length 为 1 而它应该是 0 因此我不得不检查第一个元素是否为空通过collection.length == 1 && jQuery.isEmptyObject(BasicDealList.toJSON()[0]
这非常难看。
代码如下:
BasicDeal = Backbone.Model.extend();
BasicDealCollection = Backbone.Collection.extend({
model: BasicDeal,
url: '/some/ajax/url/',
});
BasicDealList = new BasicDealCollection();
BasicDealList.on("reset", function(collection, response){
isEmpty = collection.length == 1 && jQuery.isEmptyObject(BasicDealList.toJSON()[0]);
if (isEmpty){
// render no deal found html
}
else{
// render list of deals
}
}
BasicDealList.fetch();
最佳答案
如果您不喜欢监听reset
,您可以将回调直接传递给.fetch()
:
BasicDealList.fetch({
success: function(collection, response){
// ...
}
});
如果稍后在您的应用程序中,您想知道您是否已经获取了数据,您通常可以只检查 BasicDealList.length
。如果你想避免重复请求服务器上实际上是空的集合,你可能需要制定一个自定义解决方案,例如在 .fetch()
上设置标志:
BasicDealList.fetch({
success: function(collection, response){
BasicDealList.fetched = true;
// ...
}
});
至于空数据问题,您应该从服务器返回 []
而不是 {}
。 Backbone 的 Collection 在 .reset()
中调用 this.add(models, ...)
,并且 .add()
检查 >models
参数是一个数组;如果不是,则将其包装成一个:
models = _.isArray(models) ? models.slice() : [models];
因此传递 {}
将导致 models
设置为 [{}]
,这不是您想要的。如果您无法控制服务器,您可以在自定义 .parse()
方法中检查 {}
,返回 []
如果找到了。
关于javascript - Backbone.js:检查数据是否准备好以及数据集是否为空的优雅方式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10016562/