我知道有很多方法可以做到这一点...但为什么这种方法不起作用?
var selected = this.collection.where({checked: true});
var mapped = _.map(selected, Backbone.Model.prototype.toJSON.call);
this.$el.html(this.template(mapped));
错误是未捕获类型错误:未定义不是函数
有没有更简洁的方法?
编辑这做了我想要的......
var mapped = _.invoke(selected, Backbone.Model.prototype.toJSON);
编辑 2 @nikoshr 让它变得更好。
var mapped = _.invoke(selected, 'toJSON');
最佳答案
看看_.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])
Calls the method named by methodName on each value in the list.
适用于您的案例:
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/