2012-07-28 64 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);