我有一个{name: value}
A = {
name: x,
name: y,
name: z
}
我想要获取一个集合(包含其属性为' name'的模型),但为了获得最佳效果,我想获取属性' name&#的值39;存在于我的字典中。
有没有办法像这样进行特定过滤?
答案 0 :(得分:4)
如果您正在进行过滤客户端过滤,那么覆盖过滤方法真的不是可行的方法。
如果您以后需要,现在您不再拥有它。此外,从过滤方法中修改集合本身是一个不良的副作用。
相反,您应该使用parse method,这将在获取集合时自动调用。
根据我的理解,您希望将获取的集限制为名称与字典中的键匹配的模型。
如果是这样,我会做以下事情:
parse: function(response, options) {
// Do we want to filter the response?
if (options.filterNames) {
// Filter
response = _.filter(response, function(obj) {
// Check if this model name is one of the allowed names
return _.contains(options.filterNames, obj.name);
});
}
// Backbone will use the return value to create the collection
return response;
}
然后使用
调用fetchsomeCollection.fetch({filterNames: _.keys(someDictionary)});
如果您确定,您将始终在fetch上过滤集合,您可以省略传递选项并只使用解析中的字典。
或者你可以在集合上创建一个fetchFiltered()
方法,然后调用上面的那一行。
答案 1 :(得分:0)
经过调查和试验,以下两种方法可以解决: 1.从服务器获取集合后的客户端过滤。这是一种不太理想的方法,特别是当集合很大时。在您真正想要1000个模型集合中的5个模型的情况下,它可能是一种过度杀伤力。但是如果服务器端没有接受和使用过滤客户端的逻辑,那么过滤应该类似于:
重载收集过滤器代码,例如:
var filter = {
filter: function() {
var results = _.filter(this.models, function(model) {
// Perform the check on this model, like compare it to your local dict
if (checkPassed) {
return true;
}
return false;
});
results = _.map(results, function(model) {
return model.toJSON();
});
// Reset the existing collection to filtered models
this.reset(results) ;
};
var ExtendedCollection = OriginalCollection.extend(filter);