我希望能够搜索backbonejs集合中包含的模型属性。这就是我现在这样做的方式......
wherePartial: function(attrs) {
// this method is really only tolerant of string values. you can't do partial
// matches on objects, but you can compare a list of strings. If you send it a list
// of values; attrs={keyA:[1,2,3],keyB:1}, etc the code will loop through the entire
// attrs obj and look for a match. strings are partially matched and if a list is found
// it's expected that it contains a list of string values. The string values should be considered
// to be like an OR operation in a query. Non-list items are like an AND.
if (_.isEmpty(attrs)) return [];
var matchFound = false;
return this.filter(function(model) {
// this is in the outer for loop so that a function isn't created on each iteration
function listComparator(value, index, list){
return model.get(key).toLowerCase().indexOf(value.toLowerCase()) >= 0;
}
for (var key in attrs) {
if (_.isArray(attrs[key])){
matchFound = _.any(attrs[key],listComparator);
if (matchFound !== true) return false;
} else {
matchFound = model.get(key).toLowerCase().indexOf(attrs[key].toLowerCase()) >= 0;
if (matchFound === false) return false;
}
}
return true;
});
}
假设“C”是一个实例化的集合,这就是我使用它的方式:
姓名:乔(昵称:乔的男人昵称:乔酷昵称:乔伊)
键入文本框并转换为:
C.wherePartial({name:“joe”,昵称:[“joe the man”,“joe cool”,“joey”]})
上述方法返回名称为joe且在该范围内的所有模型,具有名称joe和任何昵称的任何模型。它适用于我用它的东西。但是,我真的想要进行不需要键的搜索:值模式。我想在搜索框中执行此操作,就像在网络上使用搜索引擎一样。我想过只看每个模型的每个属性,但是当你有一个大型集合(160k +型号)时,这需要一段时间。
过去有没有人遇到这样的需求?如果是这样,你是如何解决的?我想保持搜索包含在客户端上,而不是对后端使用任何ajax调用。原因是整个集合已经加载到客户端上。
答案 0 :(得分:0)
我想到了一种方法。在模型实例化期间将属性序列化为字符串。收听更新并更新序列化。
serializeAttr: function(){
this.serializedAttr = "";
var self = this;
_.each(this.toJSON(),function(value, key, list){
self.serializedAttr += value;
});
}
然后我可以对该缓存值进行简单搜索:
cc.serializedAttr.toLowerCase()。indexOf(“joe”)> = 0