2014-05-07 225 views
1

所以下面是我在做什麼只是一個粗略的想法,集合是嵌套的,我需要調用getMax()this.collection.get('players')改變骨幹聽嵌套模型/集合?

module.exports = LeadersCollectionView = Marionette.CompositeView.extend({ 
    className: 'live-stats', 
    template: require('../../../templates/leaders/live-stats.hbs'), 
    initialize: function() { 
     this.listenTo(this.collection, 'change', this.render); 
     //this.listenTo(this.collection.get('players'), 'change', this.render); 
    }, 
    getMax : function(attribute) { 
     console.log('getMax called') 
     var home = this.collection.get('5368dcc1227a937829b2cb4a').players.models; 
     var away = this.collection.get('5368dcd9227a937829b2cb4c').players.models; 
     leaders = new PlayersCollection(home.concat(away)) 
     return leaders.max(function(leader) { 
      return leader.get(attribute); 
     }); 
    }, 
    templateHelpers:function(){ 
     return { 
      maxPoints: this.getMax('points').get('player_name') 
     } 
    }, 
    itemView: leadersView, 
    appendHtml: function(collectionView, itemView){ 
     collectionView.$('.live-data .created-teams').append(itemView.el); 
    } 
}); 

我使用骨幹關係,然後決定放棄它,現在我想我可能會再次需要它,但希望有一個更簡單的方法。

因此,雖然有可能是一個更好的方式來寫getMax()功能(顯然靜態團隊傳遞截至目前)我真的不能使用它,如果我不能更新getMax()當點的球員模型中的變化。

所以我的問題我可以聽一個沒有骨幹關係的嵌套模型的變化,我會怎麼做?

回答

2

拿上Backbone.DeepModel一看:你可以訂閱改變:玩家*事件

或骨幹關係堅持。

+0

好吧我肯定對要回其中的一個,無論扶着我怎麼寫的'GetMax的()'功能,我將仍然需要以某種方式聽取變化所以是絕對需要的,要更新的功能。我認爲我使用DeepModel時感覺不舒服,直到我沒有看到有理由,現在我有一個,謝謝! –

+0

我認爲deepmodel會更少的配置和更輕量級我看看,我試圖保持最小和乾淨的東西。 –

0

我不能讓deepmodel或nestedmodels工作,但這似乎是一個很好的解決方案,它非常簡單,但我沒有考慮像這樣使用它。

this.collection.each(function(team) { 
    team.players.bind('change', this.render); 
}, this); 
+1

我會建議傾聽添加,刪除收集更改情況下的事件: team.players.bind('add',this.render); team.players.bind('remove',this.render); –

+0

謝謝,我會這樣做,總是有些警告,所以希望這會阻止我正在測試它,並且我確定下線會派上用場,傾聽這些事件。 –

2

我只是想爲任何需要此功能的人提供自制解決方案。從本質上講,您只需在模型聲明中創建一個新方法,一般會讓您在觸發時更新屬性,以便使用model.on(「change:my.nested.attr」);

// Create your model; inside create a new method that will 
// set nested attributes (ie: setNestedAttr()) 
var nestedBackboneAttributeSample = Backbone.Model.extend({ 
    defaults: { 
     id: null, 
     nestedProperties: { 
      name: null, 
      age: null, 
      email: null 
     } 
    }, 
    /** 
    * [setNestedAttr Set nested attribute and fire change event] 
    * @param {[type]} nestedObj [object inside of this.attributes] 
    * @param {[type]} property [property inside of nestedObj] 
    * @param {[type]} value  [value to replace nestedObj[property] with] 
    */ 
    setNestedAttr: function(nestedObj, property, value) { 

     // get current nested obj from this.attributes 
     var ref = this.get(nestedObj) 
      triggerString = "change:" + nestedObj + "." + property; 

     console.log("Nested Object retrieved =>"); 
     console.log(ref); 

     // if this.attributes.nestedObj has the property and 
     // value is defined 
     if (ref.hasOwnProperty(property) && value != undefined) { 

      ref[property] = value; 
      this.set({ nestedObj: ref }); 
      // manually trigger.. backbone doesn't monitor nested attrs 
      this.trigger(triggerString); 

     } 

    } 
}); 

// now, let's run some sampel code to give you 
// an idea of how to use this. 

var x = new nestedBackboneAttributeSample(); 

// setup event handler for on change w/specific nested attr 
x.on("change:nestedProperties.name", function() { 
    console.log("this event was fired!"); 
}); 

x.setNestedAttr("nestedProperties", "name", "Github") 
// output => "this event was fired!" 
+1

不錯,希望早些時候我會遇到這個,我用兩個獨立的集合構建了應用程序。我發現這樣做確實更好。當你弄清楚如何通過ID關聯模型時,它變得更容易。 –