2015-10-02 34 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/

相关问题