我的应用程序有以下型号:
App.Store = DS.Store.extend({
revision: 11,
adapter: 'DS.FixtureAdapter'
});
App.List = DS.Model.extend({
name: DS.attr('string'),
users: DS.hasMany('App.User'),
tweetsUnread: function(){
/////////////////////////////////////////
// Code to dynamically calculate the sum
// of tweetsUnread property of all
// App.User that are related to this list
/////////////////////////////////////////
}
});
App.User = DS.Model.extend({
screenName: DS.attr('string'),
tweets: DS.hasMany('App.Tweet'),
tweetsUnread: function(){
// TODO: check if this is the correct way to do it
return this.get('tweets').get('length');
}.property('tweets.@each'),
list: DS.belongsTo('App.List')
});
App.Tweet = DS.Model.extend({
text: DS.attr('string'),
user: DS.belongsTo('App.User')
});
Run Code Online (Sandbox Code Playgroud)
如何计算所有App.User.tweetsUnread的总和并使其自动更新App.List.tweetsUnread?
Kal*_*man 40
另一个选择是使用这里Ember.computed.sum看到
App.List = DS.Model.extend({
name: DS.attr('string'),
users: DS.hasMany('App.User'),
tweetsUnread: Ember.computed.mapBy('users', 'tweetsUnread'),
totalTweetsUnread: Ember.computed.sum('tweetsUnread')
});
Run Code Online (Sandbox Code Playgroud)
mav*_*ein 15
以下应该这样做.使用reduce可能有一个更简洁的解决方案,但我自己从未使用过它:-)
App.List = DS.Model.extend({
name: DS.attr('string'),
users: DS.hasMany('App.User'),
tweetsUnread: function(){
var users = this.get("users");
var ret = 0;
users.forEach(function(user){
ret += users.get("tweetsUnread");
});
return ret;
}.property("users.@each.tweetsUnread")
});
Run Code Online (Sandbox Code Playgroud)
更新:这是使用reduce的更优雅的解决方案.我从来没有使用它,这没有测试,但我相信这应该工作:
App.List = DS.Model.extend({
name: DS.attr('string'),
users: DS.hasMany('App.User'),
tweetsUnread: function(){
var users = this.get("users");
return users.reduce(0, function(previousValue, user){
return previousValue + users.get("tweetsUnread");
});
}.property("users.@each.tweetsUnread")
});
Run Code Online (Sandbox Code Playgroud)
在Ember 1.1中,reduce的API已经改变了!对于提示,@ joelcox,参数initialValue和callback已经改变了它们的位置.所以这里是正确的代码版本:
App.List = DS.Model.extend({
name: DS.attr('string'),
users: DS.hasMany('App.User'),
tweetsUnread: function(){
var users = this.get("users");
return users.reduce(function(previousValue, user){
return previousValue + user.get("tweetsUnread");
}, 0);
}.property("users.@each.tweetsUnread")
});
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
9441 次 |
| 最近记录: |