我们可以使用下划线"其中"过滤CID

时间:2015-07-29 01:18:37

标签: javascript backbone.js underscore.js

我只是想知道我们是否只能按属性过滤Backbone集合,而不能过滤其他属性,例如CID

这是正确的:

_.where(collection,{cid:'xyz'}) // filters by cid property?

_.where(collection,{attributes:{firstName:'foo'}}) // filters by attributes.firstName?

我希望有人能理解我对如何使用嵌套属性过滤的困惑。

有人可以解释一下,是否可以通过顶级属性(如CID)进行过滤,或者是否将Backbone集合配置为仅按属性进行过滤。

1 个答案:

答案 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#modelsBackbone.Model#attributes属性,而是使用各种方法。通常情况下,处理模型和属性的更好方法是确保处理任何内部簿记。