我有以下两种模型:

App.City = DS.Model.extend({
    cityId: DS.attr('number'),
    name: DS.attr()
});

App.Country = DS.Model.extend({
    countryId: DS.attr('number'),
    name: DS.attr()
});

我的城市固定装置如下所示:
App.City.FIXTURES = [
    { id: 1, name: 'Dallas', cityId: 1 },
    { id: 2, name: 'Waco', cityId: 2 },
    { id: 3, name: 'Waco', cityId: 2 },
    { id: 4, name: 'Nashville', cityId: 3 },
    { id: 5, name: 'Norfolk', cityId: 4 }
];

我的清单如下所示:
  • 达拉斯(删除)
  • Waco(删除)
  • Waco(删除)
  • 纳什维尔(删除)
  • 诺福克(删除)

  • 我希望我的列表按cityId分组,然后按名称排序:
  • 1x达拉斯(删除)
  • 1x纳什维尔(删除)
  • 1x诺福克(删除)
  • 2x Waco(删除)

  • 当用户单击Waco旁边的删除时,2倍变成1倍,并从存储中删除其中一个Waco记录。如果用户再次单击删除,则将从列表中删除Waco,并从存储中删除最后一个Waco记录。

    我在同一 View 上有两个不同的列表,并且希望每个列表(分组和排序)的行为相同。

    这是我现在拥有的代码:http://jsfiddle.net/cLNJj/1/

    最佳答案

    这是JSBin更新为您想要做的事情:http://jsfiddle.net/qv8f8/

    基本上,它使用计算属性仅获取uniq模型。您可以在这里看到:

    uniqCities: function() {
        var cities = this.get('content');
        var names = cities.mapBy('name');
        var uniqCities = cities.filter(function(item, idx, array) {
            if (names.contains(item.get('name'))) {
                names.removeObject(item.get('name'));
                return true;
            } else {
                return false;
            }
        });
        return uniqCities;
    }.property('content'),
    

    然后在ObjectController中,它具有count属性,该属性检查当前模型在其父级内容中重复多少次:
    count: function() {
        var cities = this.get('parentController.content'),
            citiesWithThisName = cities.filterBy('name', this.get('name'));
        return citiesWithThisName.get('length');
    }.property('content'),
    

    随意问任何问题。

    在评论中针对您的问题进行了更新:

    我已经更新了JSBin,以更改计数并正确删除已删除的项目。这里的主要/唯一更改是对uniqCities计算属性使用model.length。我实际上不确定为什么需要这样做,因为我很确定不需要在自己的代码中这样做,但这可能是对Fixture适配器的警告。 Check out the JS Bin here.

    至于排序,我会check out this answer到另一个SO问题。那应该引导您朝正确的方向前进。

    为了使它更具可重用性,我建议您为该路由使用两个不同的阵列 Controller 。这样,您可以创建ArrayController的基本抽象子类,该子类上可以具有uniqueCities / Countries方法,然后将其用于两个新 Controller 。不过,我会让您自行解决。 :)

    09-07 17:39