我有以下两种模式:
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分组,然后按名称排序:
当用户点击Waco旁边的删除时,2x变为1x,并从商店中删除其中一个Waco记录。如果用户再次单击“删除”,则会从列表中删除Waco,并从商店中删除最后一个Waco记录。
我在同一个视图上有两个不同的列表,并希望每个列表具有相同的行为(分组和排序)。
这是我现在拥有的代码:http://jsfiddle.net/cLNJj/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方法,然后将它用于两个新的控制器。我会让你自己解决这个问题。 :)