2

我有以下两个模型:

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 }
];

我的列表如下所示:

  • 达拉斯(删除)
  • 韦科(删除)
  • 韦科(删除)
  • 纳什维尔(删除)
  • 诺福克(删除)

我希望我的列表按 cityId 分组,然后按名称排序:

  • 1x 达拉斯(删除)
  • 1x 纳什维尔(删除)
  • 1x 诺福克(删除)
  • 2x Waco(删除)

当用户单击 Waco 旁边的删除时,2x 变为 1x,并从商店中删除一条 Waco 记录。如果用户再次单击删除,Waco 将从列表中删除,最后一条 Waco 记录将从存储中删除。

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

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

4

1 回答 1

2

这是 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 以更改计数并正确删除已删除的项目。这里的主要/唯一变化是model.length用于 uniqCities 计算属性。我实际上不确定为什么需要这样做,因为我很确定我不需要在自己的代码中这样做,但这可能是 Fixture 适配器的一个警告。在这里查看 JS Bin。.

至于排序,我会查看另一个 SO question 的答案。这应该会引导你朝着正确的方向前进。

啊,为了使它更可重用,我建议使用两个不同的阵列控制器用于该路线。这样,您可以创建 ArrayController 的基本抽象子类,它可以在其上具有 uniqueCities/Countries 方法,然后将其用于两个新控制器。不过,我会让你自己弄清楚。:)

于 2013-11-11T19:21:01.587 回答