Bar*_*art 14 backbone.js underscore.js lodash
我必须在这里找到一些简单的东西.
我正在学习Backbone和Underscore/loDash,我正在努力学习chain.
我有以下代码,它按预期工作:
var ids = _.pluck(collection.where({'is_checked':true}), 'id');
Run Code Online (Sandbox Code Playgroud)
我尝试重构这个,使用chain如下:
var ids = collection.chain().where({'is_checked':true}).pluck('id').value();
Run Code Online (Sandbox Code Playgroud)
为什么重构代码不起作用?我用chain错了吗?
解决方案(详见下方)
不要使用where带chain.
mu *_*ort 18
将一些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();
Run Code Online (Sandbox Code Playgroud)
但是collection.chain()不能那样工作,chain只是models直接包装集合,所以如果你这样做:
console.log(collection.chain());
Run Code Online (Sandbox Code Playgroud)
你会看到它chain给你一个包装模型数组的对象.你的模型没有is_checked属性(即没有属性model.is_checked),但它们会有is_checked属性(即会有model.get('is_checked')和model.attributes.is_checked).
现在我们可以看到出现问题的地方:
collection.chain().where({'is_checked':true})
Run Code Online (Sandbox Code Playgroud)
模型没有is_checked属性.特别是,不会有任何地方车型is_checked是true和一切后,where与空数组工作.
现在我们知道事情的进展,我们如何解决它?好吧,你可以使用filter而不是where这样你可以轻松解开模型:
collection.chain()
.filter(function(m) { return m.get('is_checked') })
.pluck('id')
.value();
Run Code Online (Sandbox Code Playgroud)
但是,你的模型还没有,id因为你没有使用ids 创建它们而你没有与服务器通信以获得ids所以你将得到一个undefineds 的数组.如果你添加一些ids:
var collection = new App.OptionCollection([
{id: 1, 'is_checked': true},
{id: 2, 'is_checked': true},
{id: 3, 'is_checked': false}
]);
Run Code Online (Sandbox Code Playgroud)
然后你会得到[1,2]你正在寻找的东西.
演示:http://jsfiddle.net/ambiguous/kRmaD/
| 归档时间: |
|
| 查看次数: |
2772 次 |
| 最近记录: |