我知道有很多方法可以做到这一点...但是为什么这种方法行不通呢?

var selected = this.collection.where({checked: true});

var mapped = _.map(selected, Backbone.Model.prototype.toJSON.call);

this.$el.html(this.template(mapped));


错误是Uncaught TypeError: undefined is not a function

还有更简洁的方法吗?

编辑这是我想要的...

var mapped = _.invoke(selected, Backbone.Model.prototype.toJSON);


编辑2 @nikoshr使它变得更好。

var mapped = _.invoke(selected, 'toJSON');

最佳答案

从版本1.5.1开始,您将看到_.map源代码。

_.map = _.collect = function(obj, iterator, context) {
    var results = [];
    if (obj == null) return results;
    if (nativeMap && obj.map === nativeMap) return obj.map(iterator, context);
    each(obj, function(value, index, list) {
      results.push(iterator.call(context, value, index, list));
    });
    return results;
};


这意味着对于selected中的每个对象,您将以Backbone.Model.prototype.toJSON.call.call和一个未指定的上下文结尾,这可能不是您想要的。

在每个模型上调用toJSON的最简单方法是使用_.invoke


  调用_.invoke(列表,方法名,[*参数])
  调用名为
  通过methodName在列表中的每个值上。


适用于您的情况:

var mapped = _.invoke(selected, 'toJSON');


和演示



var c = new Backbone.Collection([
    {id: 1, checked: true},
    {id: 2, checked: false},
    {id: 3, checked: true}
]);
var selected = c.where({checked: true});

var mapped = _.invoke(selected, 'toJSON');
console.log(mapped);

<script src="https://cdnjs.cloudflare.com/ajax/libs/underscore.js/1.8.3/underscore-min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/backbone.js/1.3.3/backbone-min.js"></script>

关于javascript - Backbone -JSON的模型数组,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/18362138/

10-10 09:01