1

在谷歌上搜索了几天后,我终于强迫自己在这里问这个问题。

我的json文件很少。

localhost/feed01.json
localhost/feed02.json
localhost/feed03.json

所有json与此类似的文件结构。但随机数据包括随机、id、日期类型等...

[
        {
            "id":1,
            "date": "12/12/2011",
            "type": "Run",
            "distance": "3 miles",
            "comments": "This was really hard",
            "minutes": 36
        },
        {
            "id":2,
            "date": "12/11/2011",
            "type": "Bike",
            "distance": "6 miles",
            "comments": "All down hill...felt like nothing",
            "minutes": 30
        },
        {
            "id":3,
            "date": "12/10/2011",
            "type": "Walk",
            "distance": "2.5 miles",
            "comments": "Shouldn't have taken the dog",
            "minutes": 45
        }
]

现在我想将所有这些 json 文件合并到一个文件中,并默认按日期排序(在初始化时)。backbone.js使用集合进行合并和排序的最佳方法是什么?

4

2 回答 2

1

Backbone 允许您通过选项覆盖一些backbone.sync

  • 您可以将目标 url 作为选项传递collection.fetch以覆盖默认 url
  • 并传递add: true将模型附加到集合而不是重置它

这意味着您可以使用

var c = new Backbone.Collection();
c.fetch({
    url: ('localhost/feed01.json'),
    add: true
});
c.fetch({
    url: ('localhost/feed02.json'),
    add: true
});
...

要在所有获取完成后调用回调,您可以构建一个jQuery 延迟对象

var files = ['localhost/feed01.json', 'localhost/feed02.json', 'localhost/feed03.json'];
var c=new Backbone.Collection();
var dfds = [], dfd, i, l;
for (i=0, l=files.length; i<l;i++) {
    dfd = c.fetch({
        url: (files[i]),
        add: true
    });
    dfds.push(dfd);
}

$.when.apply(null, dfds).done(function() {
    console.log(c.pluck('id'));
});
于 2012-10-22T11:37:44.070 回答
0

要合并数据,只需创建一个集合和所有带有 json 对象/模型表示的数组到这个集合。要实现该功能,您可以覆盖 fetch 方法并使其执行 3 次 ajax 调用并使用 jquery deferreds 等到所有三个都已解决并将返回的数据添加到集合中,然后再解决 fetch 请求。

要更改排序逻辑,您需要覆盖集合比较器方法以根据您的数据进行排序。

您可以将其指定为例如 this

comparator: function(model) {
    return +new Date(model.get('date'));
}

它会按日期排序。

如果您出于某种原因在将模型添加到集合后指定比较器,则需要调用 sort 方法,以便根据比较器指定的规则对模型进行排序

于 2012-10-22T11:50:51.833 回答