Ember集团和订单

时间:2013-11-11 17:49:52

标签: ember.js ember-data

我有以下两种模式:

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 Norfolk(删除)
  • 2x Waco(删除)

当用户点击Waco旁边的删除时,2x变为1x,并从商店中删除其中一个Waco记录。如果用户再次单击“删除”,则会从列表中删除Waco,并从商店中删除最后一个Waco记录。

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

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

1 个答案:

答案 0 :(得分: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适配器的一个警告。 Check out the JS Bin here.

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

啊,为了让它更具可重复性,我建议使用两个不同的阵列控制器来用于该路由。这样你就可以创建一个ArrayController的基本抽象子类,它可以在其上有uniqueCities / Countries方法,然后将它用于两个新的控制器。我会让你自己解决这个问题。 :)