一定有什么简单的东西我错过了。
http://jsfiddle.net/v9mdZ/
我正在学习Backbone.js和Underscore.js/Lodash,并试图熟悉chain
。
我有下面的代码,它按预期工作:
var ids = _.pluck(collection.where({'is_checked':true}), 'id');
我尝试重构它,使用chain
如下:
var ids = collection.chain().where({'is_checked':true}).pluck('id').value();
为什么重构后的代码不起作用?我用chain
错了吗?
解决方案(详见下文)
不要将where
与chain
一起使用。
1条答案
按热度按时间wpcxdonn1#
将一些Underscore方法合并到集合中有点不完美。当你说
collection.some_mixed_in_underscore_method()
时,集合在你背后打开了一些Backbone的东西,以便Underscore方法应用于集合模型中的属性;它的工作原理是这样的:但是
collection.chain()
并不是这样工作的,chain
只是直接 Package 集合的models
,所以如果你这样做:你会看到
chain
给你一个对象,它 Package 了一个模型数组。您的模型不会有is_checked
属性(即没有model.is_checked
),它们将具有is_checked
属性(即,将有model.get('is_checked')
和model.attributes.is_checked
)。现在我们可以看到一切都出错了:
模型没有
is_checked
属性。特别是,将不会有任何模型,其中is_checked
是true
,并且where
之后的所有内容都使用空数组。现在我们知道事情出了什么问题,我们该如何解决?你可以使用
filter
而不是where
,这样你就可以轻松地解包模型:但是,您的模型还没有
id
s,因为您没有使用id
s创建它们,并且您还没有与服务器交谈以获取id
s,因此您将获得undefined
s的数组。如果添加一些id
s:然后你会得到你要找的
[1,2]
。演示:http://jsfiddle.net/ambiguous/kRmaD/