假设我有以下数组,这在我的控制器中使用
songs = [
{trackNumber: 4, title: 'Ob-La-Di, Ob-La-Da', genre: 'pop'},
{trackNumber: 2, title: 'Back in the U.S.S.R.', genre: 'rock'},
{trackNumber: 3, title: 'Glass Onion', genre: 'pop'},
];
我想在我的控制器上有一个属性,它返回一组独特的流派
例如
genres: function() {
...
}...
在这种情况下会返回
['pop', 'rock']
有没有一些优雅的方法来使用ember,使用计算属性或观察者来做到这一点?
答案 0 :(得分:20)
我的原始答案位于底部,但最新的Ember版本为此提供了一个非常好的新解决方案:
genres: Ember.computed.mapBy('songs', 'genre'),
uniqueGenres: Ember.computed.uniq('genres'),
上一个回答:
genres: function() {
return this.get('songs').map(function(song){
return song.genre
}).filter(function(genre, index, arr){
return arr.indexOf(genre) == index // throw away any instances which are not first
})
}.property('songs'),
请注意,我正在利用“现代”数组函数,例如map和filter,如果你需要支持旧浏览器,你需要填充这些或者用另一种方式编写。我用来删除重复项的过滤器是我发生的第一个过滤器,它可能不是很高效,如果你已经加载了一个具有独特功能的库(比如underscore.uniq),你应该使用它。
当然,Ember当然很少,最后的.property('songs')
实际上只需指定这是一个计算属性,如果歌曲改变,它将被缓存并重新计算(假设为Ember 1.0)