Backbone / Underscore chain方法与where方法

tf7tbtn2  于 2023-05-17  发布在  其他
关注(0)|答案(1)|浏览(169)

一定有什么简单的东西我错过了。
http://jsfiddle.net/v9mdZ/
我正在学习Backbone.jsUnderscore.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错了吗?

解决方案(详见下文)

不要将wherechain一起使用。

wpcxdonn

wpcxdonn1#

将一些Underscore方法合并到集合中有点不完美。当你说collection.some_mixed_in_underscore_method()时,集合在你背后打开了一些Backbone的东西,以便Underscore方法应用于集合模型中的属性;它的工作原理是这样的:

var ary = _(this.models).map(function(m) { return m.attributes });
return _(ary).some_mixed_in_underscore_method();

但是collection.chain()并不是这样工作的,chain只是直接 Package 集合的models,所以如果你这样做:

console.log(collection.chain());

你会看到chain给你一个对象,它 Package 了一个模型数组。您的模型不会有is_checked属性(即没有model.is_checked),它们将具有is_checked属性(即,将有model.get('is_checked')model.attributes.is_checked)。
现在我们可以看到一切都出错了:

collection.chain().where({'is_checked':true})

模型没有is_checked属性。特别是,将不会有任何模型,其中is_checkedtrue,并且where之后的所有内容都使用空数组。
现在我们知道事情出了什么问题,我们该如何解决?你可以使用filter而不是where,这样你就可以轻松地解包模型:

collection.chain()
          .filter(function(m) { return m.get('is_checked') })
          .pluck('id')
          .value();

但是,您的模型还没有id s,因为您没有使用id s创建它们,并且您还没有与服务器交谈以获取id s,因此您将获得undefined s的数组。如果添加一些id s:

var collection = new App.OptionCollection([
    {id: 1, 'is_checked': true},
    {id: 2, 'is_checked': true},
    {id: 3, 'is_checked': false}
]);

然后你会得到你要找的[1,2]
演示:http://jsfiddle.net/ambiguous/kRmaD/

相关问题