我正在使用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
问题是,我会把最后一段代码放在哪里?也许它需要在模型之外,如果是这样,我怎么能告诉方法将这些属性插入到正确的模型中?
答案 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();
}
});