我知道有很多方法可以做到这一点...但是为什么这种方法行不通呢?
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/