我只是想知道我们是否只能按属性过滤Backbone集合,而不能过滤其他属性,例如CID
这是正确的:
_.where(collection,{cid:'xyz'}) // filters by cid property?
_.where(collection,{attributes:{firstName:'foo'}}) // filters by attributes.firstName?
我希望有人能理解我对如何使用嵌套属性过滤的困惑。
有人可以解释一下,是否可以通过顶级属性(如CID)进行过滤,或者是否将Backbone集合配置为仅按属性进行过滤。
答案 0 :(得分:5)
通常,您使用_.where
搜索对象数组以查找匹配的属性。所以说_.where(collection, ...)
没有多大意义,你想要搜索集合的models
数组:
var a = _.where(collection.models, { cid: 'xyz' })
这或多或少与以下内容相同:
var a = [ ], i;
for(i = 0; i < collection.models.length; ++i)
if(collection.models[i].cid === 'xyz')
a.push(collection.models[i])
_.where
不了解Backbone集合的特殊结构,因此它不知道应该查看collection.models
还是attributes
在模型中,除非你说出来。由于cid
是模型的属性而不是属性,因此上述_.where
有效。
如果您要搜索模型属性,那么您需要使用Underscore methods that are mixed into collections进行调整以查看集合的models
或者知道模型中attributes
对象的特殊Collection#where
。因此,如果您想查找firstName
属性,那么您可以说:
collection.where({ firstName: 'foo' })
不支持开箱即用地搜索嵌套对象。但是,所有where
只是_.filter
的包装器,因此您可以编写自己的谓词函数来执行任何操作:
collection.filter(function(model) {
// Do whatever you want to model, return true if you like
// it and false otherwise.
});
在大多数情况下,您应该尝试忽略Backbone.Collection#models
和Backbone.Model#attributes
属性,而是使用各种方法。通常情况下,处理模型和属性的更好方法是确保处理任何内部簿记。