0

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」がインスタンス化されたコレクションであると仮定すると、これが私がそれを使用する方法です:

名前:joe(ニックネーム:joe the man ニックネーム:joe cool ニックネーム:joey)

テキストボックスに入力され、次のように変換されます。

C.wherePartial({name:"joe",nicknames:["joe the man","joe cool","joey"]})

上記のメソッドは、joe という名前を持つすべてのモデルと、そのスコープ内のすべてのモデル、joe という名前を持つすべてのモデル、およびニックネームのいずれかを返します。それは私がそれを使用するためにうまく機能します。ただし、key:value パターンを必要としない検索を行いたいと考えています。Webで検索エンジンを使用するときのように、検索ボックスでこれを行いたいと思います。各モデルのすべての属性を確認することも考えましたが、大きなコレクション (160,000 以上のモデル) がある場合は時間がかかります。

過去にこのようなニーズに遭遇した人はいますか? もしそうなら、どのように解決しましたか?クライアントに含まれる検索を保持し、バックエンドへの ajax 呼び出しを使用したくありません。これは、コレクション全体がすでにクライアントにロードされているためです。

4

1 に答える 1

0

私はそれを行う方法を考えました。モデルのインスタンス化中に属性を文字列にシリアル化します。更新をリッスンし、シリアライゼーションを更新します。

serializeAttr: function(){
 this.serializedAttr = "";
 var self = this;
 _.each(this.toJSON(),function(value, key, list){
   self.serializedAttr += value;
 });
}

次に、そのキャッシュされた値に対して簡単な検索を実行できます。

cc.serializedAttr.toLowerCase().indexOf("ジョー") >= 0

于 2012-05-17T20:44:43.637 に答える