2012-07-28 67 views
2

我计算性质都非常相似的集合:干燥起来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') 

有没有什么办法可以改变这一个属性,可能是一组欢迎使用属性?

回答

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);