0

我知道有很多方法可以做到这一点......但为什么这种方法不起作用?

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');
4

2 回答 2

3

看看_.map源代码,你会看到,从 1.5.1 版本开始

_.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 _.invoke(list, methodName, [*arguments])
对列表中的每个值调用由 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>

于 2013-08-21T16:05:02.487 回答
0

检查映射是否是您所期望的,在 chrome 调试器中使用断点或添加 console.log(mapped)。如果映射看起来不错,那么您可能没有将某些值传递给模板。如果您还有其他问题,请发布模型、集合和模板的定义。顺便说一句,this.template 是一个函数,用调试器或 console.log(typeof this.template) 再次查看

于 2013-08-21T15:58:53.133 回答