如何用_.each()操作Backbone集合模型?排查element未定义问题
Backbone集合遍历:为什么_.each直接用集合会拿到undefined?
我来帮你理清这个问题的来龙去脉,其实核心是Backbone集合不是普通数组,是封装过的对象,直接用Underscore的_.each迭代集合本身会踩坑。
为什么第一次尝试会拿到undefined?
当你执行_.each(this.someCollection, function(element) { ... })时,Underscore是在迭代Backbone集合对象的可枚举属性(比如length、_byId、models这些),而不是集合里的模型。这些属性里有些值可能就是undefined,所以你才会看到element始终是undefined。
为什么第二种方法能生效?
你用list.at(index)能拿到模型,是因为list就是集合对象本身,Backbone的at()方法本来就是通过索引从集合内部的models数组(真正存模型的地方)里取对应元素。这种写法确实能拿到模型,但属于绕了个远路,不是最优解。
正确的遍历方式有两种,推荐优先用第一种:
- 用Backbone集合自带的
each方法(最推荐)
Backbone已经给集合封装了each方法,内部帮你处理了迭代模型的逻辑,直接就能拿到每个模型:
this.someCollection.each(function(model) { console.log(model); // 这里的model就是集合里的每个模型对象 });
- 用Underscore遍历集合的
models数组
如果你非要用Underscore的_.each,可以直接迭代集合的models属性(这是集合存储所有模型的原生数组):
_.each(this.someCollection.models, function(model) { console.log(model); });
这两种写法都比你第二种绕弯的方式更简洁,也更符合Backbone的设计习惯。
内容的提问来源于stack exchange,提问作者yangsunny
相关产品推荐
相关产品推荐

