干燥ember.js计算属性

时间:2012-07-28 20:43:28

标签: coffeescript ember.js

我有一组非常相似的计算属性:

WZ.ExercisesHomeController = Em.ArrayController.extend
  content: Ember.A()

  arms: ( -> 
          @filterProperty('group.name', 'Arms')
        ).property('@each.isArms')

  abs:  ( -> 
          @filterProperty('group.name', 'Abs')
        ).property('@each.isAbs')

  back: ( -> 
          @filterProperty('group.name', 'Back')
        ).property('@each.isBack')

  chest: ( -> 
          @filterProperty('group.name', 'Chest')
        ).property('@each.isChest')

  legs: ( -> 
          @filterProperty('group.name', 'Legs')
        ).property('@each.isLegs')

我有什么方法可以将其更改为一个属性,可能是一个设置的属性吗?

1 个答案:

答案 0 :(得分:3)

是。使用返回此过滤器函数的函数。

var filterFn = function(name) {
  return function() {
    return this.filterProperty('group.name', name);
  }.property('@each.is' + name);
};

Ember.ArrayController.create({
  arms: filterFn('Arms'),
  legs: filterFn('Legs'),
  ...
});

您甚至可以使用Ember重新打开来动态添加过滤功能。

App.ArrayController = Ember.ArrayController.extend();

var names = ['Arms', 'Legs', ...];

var toAdd = {};
names.forEach(function(name) {
  toAdd[name] = filterFn(name);
});

App.ArrayController.reopen(toAdd);