2015-10-02 66 views
2

我使用backbonejs和underscorejs。我有一個Person模型,getFullName()函數和Persons集合與getSummary()應該返回所有人的全名。我目前的實現是:在集合中使用_.map中的模型函數

var Person = Backbone.Model.extend({ 
    defaults: { 
     name: '', 
     surname: '' 
    }, 
    getFullName: function() { 
     return this.get('name') + ' ' + this.get('surname'); 
    } 
}); 

var Persons = Backbone.Collection.extend({ 
    model: Person, 
    getSummary: function() { 
     return _.map(this.models, function(person) { 
      return person.getFullName(); 
     }).join(', '); 
    } 
}); 

console.log(
    new Persons([ 
     {name: 'john', surname: 'smith'}, 
     {name: 'mary', surname: 'poppins'} 
    ]).getSummary() 
); 

這工作很好,我在控制檯中出現以下信息:

john smith, mary poppins 

我的問題是,我不希望在getSummary()功能如此詳細。我想簡單地能夠傳遞模型的功能,而不必創建一個函數來調用它。也許這樣的事情:

getSummary: function() { 
    return _.map(this.models, 'model.getFullName').join(', '); 
} 

這是可能以某種方式?

回答

3

骨幹代理的集合和型號很多下劃線的功能,最引人注目的是非常漂亮的_.invoke

調用_.invoke(list, methodName, *arguments)
調用由方法名列表中的每個值命名方法。傳遞給invoke的任何額外參數 將被轉發到方法調用。

可以簡化你的方法是這樣的:

getSummary: function() { 
    return this.invoke('getFullName').join(', '); 
} 

並有小提琴http://jsfiddle.net/nikoshr/pxpon64q/

相關問題