1

我正在使用 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

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

4

3 回答 3

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')
于 2013-10-23T05:48:11.463 回答
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') + ".[]"));
  }
});
于 2013-10-21T04:07:18.497 回答
0

或从基础扩展:

App.SomeModel = Ember.Object.extend(BaseModel, {
   init: function(){
      this._super();
   }
});
于 2013-10-23T01:44:10.450 回答