从骨干集合中获取实时最大值

时间:2014-02-04 19:37:23

标签: javascript backbone.js

var stooges = [
     {name: 'moe', age: 40}, 
     {name: 'larry', age: 50}, 
     {name: 'curly', age: 60}
];

_.max(stooges, function(stooge){ return stooge.age; });

=> {name: 'curly', age: 60};

因为他是最老的,所以返回curly,他是上述集合的最大年龄。

PS(年龄可能不是最好的例子)让我们神奇地说,larry患有某种疾病,他每年12岁,变成62岁而curly只变成61岁,如何检测到这种变化?

在我的真实应用程序中,集合中的最大值会定期更改,我希望有一个功能可以检测到更改,因此我可以添加内容以通知用户已更改最大值。

我知道backbone.js有changed_previousAttributes和其他方法,但它们似乎只返回实际的最大值,而不是之前的最大值。

编辑:我的骨干代码中有一个方法可以获得最大值

getMax : function(attribute) {
    var home = $('#main').attr('data-home'),
        away = $('#main').attr('data-away')
    return this.collection.max(function (player) {
        return player.get("teamName") === home || player.get("teamName") === away? player.get(attribute) : 0;
    }, this);
}

因此,如果我想获取我的集合中的最大属性,我会调用this.getMax("points");并使用它来确定谁是我的最高点领导者。

我不确定如何将旧值与更改后的值进行比较,例如。 “kevin”有12分,而“adam”有10分,“kevin”是当前的最高分,所以点击我加3分给adam他现在有“13”分,现在是领先者,而“kevin”是前者领导者。

所以我无法弄清楚如何创建一个方法或语句来检测最大值是否有变化

编辑:更改处理程序

// 1 for one point
if(e.keyCode == 49 && !e.ctrlKey || e.keyCode == 97 && !e.ctrlKey) { 
    if(this.$el.hasClass('hover')) {
        var addMake = parseInt(this.model.get('made_one')) + 1;
        var addOnePoint = parseInt(this.model.get('points')) + 1;         
        this.model.save({made_one: addMake, points: addOnePoint});
        feedCollection.create({
            feedItem: 'made a freethrow', 
            playerName: this.model.get('playerName'), 
            teamName: this.model.get('teamName'),
            facebookID: this.model.get('facebookID')
        });
    }
}

好的,更改模型的实际事件是在一个单独的视图中,它实际上是一个按键事件。我在统计视图中收听对集合的任何更改,这是处理最大值的视图。在统计视图中,每次发生更改时都会对其进行渲染,因此如果值发生更改,则会自动添加相应的最大值,但我不确定如何检测更改this.listenTo(this.collection, "change", this.render);

2 个答案:

答案 0 :(得分:1)

您需要为集合

创建排序函数
class People extends Backbone.Collection
  comparator: (p1, p2) ->
    if p1.get("age") > p2.get("age") then -1 else 1

var stooges = 
     {name: 'moe', age: 40}
     {name: 'larry', age: 50}
     {name: 'curly', age: 60}

people = new People(stooges)

# whenever age changes, the people's order will be changed accordingly
people.on "change", people.sort, people

# so people.at(0) will always be the biggest
# people.at(1) will be the last biggest

# keep a reference to highest
highest = people.at(0)

# whenever sort happened, go and check if the highest is changed
people.on "sort", ->
  current_highest = people.at(0)
  create_new_feed(highest) unless current_highest.cid is highest.cid

create_new_feed = (person)->
  feeds.create({name: person.get("name")})

答案 1 :(得分:0)

好的,在研究了如何使用hasChanged方法后,我决定重新配置一些代码,以便我只使用该方法。

它只返回改变的属性而不是整个模型,所以如果我向模型添加点数,我得到的只是点值,这是不好的。

所以我专门为所有领导者/最大创建了一个新的集合,我只是检查currentPoints是否发生如下变化。

leadersCollection.each(function(model) {
    model.save({currentPoints: this.getMaxPointsPlayer().get('playerName')});
    if (model.hasChanged('currentPoints')) {

        //Here I add onto my apps feed, which adds a new item notifying the 
        //user there is a new leader
        feedCollection.create({
            feedItem: 'new leader', 
            playerName: model.get('currentPoints')
        });

    }
}, this);