元编程和计算属性

时间:2013-10-21 03:46:24

标签: ember.js

我正在使用Ember 1.0。我有一个具有几个非常相似的计算属性的模型:

countryChanged: (->
  Whistlr.showVersionRow this, 'country'
).property('country', 'previousVersion')

regionChanged: (->
  Whistlr.showVersionRow this, 'region'
).property('region', 'previousVersion')

cityChanged: (->
  Whistlr.showVersionRow this, 'city'
).property('city', 'previousVersion')

我想通过编写一个可以创建这些属性的方法来干掉它。该方法本身似乎相当简单,如:

addVersionRowComputedProperty = (propertyName) ->
  "#{propertyName}Changed": (->
    Whistlr.showVersionRow this, propertyName
  ).property(propertyName, 'previousVersion')

然后,在模型中的某个地方,我可能会做类似的事情:

for property in ["country", "region", "city"]
  addVersionRowComputedProperty property

问题是,我会把最后一段代码放在哪里?也许它需要在模型之外,如果是这样,我怎么能告诉方法将这些属性插入到正确的模型中?

3 个答案:

答案 0 :(得分:2)

您是否考虑过直接调用该方法而不是在foreach块中调用该方法?

countryChanged: addVersionRowProperty('country')
regionChanged: addVersionRowProperty('region')
cityChanged: addVersionRowProperty('city')

# somewhere outside your constructor function
addVersionRowComputedProperty = (propertyName) ->
  (->
    Whistlr.showVersionRow this, propertyName
  ).property(propertyName, 'previousVersion')

答案 1 :(得分:1)

你会把它放在模型的init中。

App.SomeModel = Ember.Object.extend({
   init: function(){
      this._super();
      // put it here
   }
});

这是一个很好的网站,谈论动态创建计算属性(我个人只是写它们,似乎它使代码更具可读性,另外它会更快,但我也喜欢DRY)。

http://www.thesoftwaresimpleton.com/blog/2013/08/11/dyanamic-cp/

这是一个JSBin,展示了如何创建计算属性

http://jsbin.com/ilosel/16/edit

App.DealStates.forEach(function(state) {

  if (!_this.get(state.get('name'))) {
    return Ember.defineProperty(_this, state.get('name'), Ember.computed(function() {
      return App.Deal.filter(function(deal) { 
        return deal.get('state') === state.get('name');
      });
    }).property("" + state.get('name') + ".[]"));
  }
});

答案 2 :(得分:0)

或从基地延伸:

App.SomeModel = Ember.Object.extend(BaseModel, {
   init: function(){
      this._super();
   }
});