我有以下两种模型:
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旁边的删除时,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 。不过,我会让您自行解决。 :)