让我说我有以下数组,这在我的控制器中使用
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',];
我想在我的控制器上有一个属性返回一系列独特的流派
例如
genres: function() { ... }...
在这种情况下会返回
['pop','rock']
有没有一些优雅的方式来做这个与ember,使用计算属性a或观察者?
解决方法
我的原始答案在底部,但最新的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'),
请注意,如果您需要支持较旧的浏览器,我将利用“现代”数组函数(如地图和过滤器),您需要对其进行垫片或以另一种方式写入.用于删除重复项的过滤器是我发生的第一个过滤器,它可能不是很好的,如果已经加载了一个独特功能的库(如underscore.uniq),那么应该使用它.
很少这是Ember具体的当然,最后的.property(‘歌曲’)是字面上所有你需要指定这是一个计算的属性,如果歌曲更改(将假定为Ember 1.0)将被缓存和重新计算