且构网

分享程序员开发的那些事...
且构网 - 分享程序员编程开发的那些事

Ember.js:计算所有子模型的属性总和

更新时间:2023-02-10 12:49:24

以下应该做到.使用reduce可能有更简洁的解决方案,但我自己从未使用过:-)

The following should do it. There might be an more concise solution using reduce, but i have never used it myself :-)

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")
});

更新:这是一个使用 reduce 的更优雅的解决方案.我从未使用过它,也没有经过测试,但我非常有信心这应该有效:

Update: This is a more elegant solution using reduce. I have never used it and this isn't tested but i am quite confident that this should work:

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")
});

在 Ember 1.1 中,reduce 的 API 发生了变化! Thx @joelcox 提示,参数 initialValue 和 callback 已经改变了它们的位置.所以这里是正确版本的代码:

In Ember 1.1 the API for reduce has changed! Thx @joelcox for the hint, that the parameters initialValue and callback have changed their position. So here the correct version of the code:

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")
});