2

collection.where を使用して backbone.js コレクションで大文字と小文字を区別しない検索を実行しようとしましたが、コレクション内の検索値とモデル フィールド値の大文字と小文字が一致する必要があることに気付きました。この例を見つけまし たが、どこで動作をオーバーライドしますか、または代替手段はありますか? ありがとう

collection.findWhere({ 'Fname': val })

collection.where({ 'Fname': val })

// 文字列の大文字と小文字が一致する場合にのみ機能します。

4

2 に答える 2

3
var myCollection = Backbone.Collection.extend({

    // define your own case insensitive where implemented using .filter
    iwhere : function( key, val ){
        return this.filter( function( item ){
            return item.get( key ).toLowerCase() === val.toLowerCase();
        });
     }  

});
于 2013-09-18T12:05:15.337 に答える
1

caseInsensitive オプションを許可するために、コレクションの where と findWhere をオーバーライドすることにしました。

  //case-insensitive where
  where: function(attrs, first, options){
    options = options || {};

    if (_.isEmpty(attrs)) return first ? void 0 : [];

    return this[first ? 'find' : 'filter'](function(model) {
      for (var key in attrs) {
        if (options.caseInsensitive) {
          if (attrs[key].toLowerCase() !== model.get(key).toLowerCase()) return false;
        } else {
          if (attrs[key] !== model.get(key)) return false;
        }
      }

      return true;
    });
  },

  findWhere: function(attrs, options) {
    return this.where(attrs, true, options);
  }

そして、次のように呼び出します。

collection.findWhere({username: "AwEsOmE"}, {caseInsensitive: true});

正確にはきれいではありませんが、元の実装でもありません。O_o

これをプル リクエストとして開くこともできますが、where 関数の「最初の」変数をオプションのキーにリファクタリングします。それは私のやることリストにあります。

于 2013-10-18T03:26:21.243 に答える