javascript - Backbone.js:检查数据是否准备好以及数据集是否为空的优雅方式

标签 javascript backbone.js

我正在为两件事寻找更好的解决方案:

  • 我如何了解数据是否已获取并准备就绪,我使用 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/

相关文章:

javascript - 关于动态创建输入的问题

javascript - 我们可以使用 Angular 2 的服务器端预渲染来代替服务器模板引擎吗?

javascript - 为什么在我的示例中提交按钮只有在按下两次时才起作用?

javascript - backbone.js:同一进程的不同输出

javascript - 在 jquery 变量中连接

javascript - 如何使用 React 在网络聊天中向上/向下按键

javascript - Backbone JS Turbolinks 未定义问题

javascript - 四个 Backbone.js 模型问题

javascript - 如何从单独文件中的另一个 View 调用主干 View 函数

javascript - Promise.all() 使用 Backbone 解决 IE 11