2017-06-19 9 views
3

memory proxyenablePaging: trueのストアが設定されています。ストアのremoteFilterremoteSorttrueに設定されているため、プロキシによって処理されるリクエストのフィルタリングとソートが行われます。ExtJS 6メモリプロキシ内でカスタムフィルタ機能を使用

複数のフィールドでストアをフィルタリングすると、AND条件ではなくOR条件を使用します。

メモリプロキシページングなしの私のようremoteFilter: false、カスタムフィルタ機能を使用できます。

store.filterBy(function (record) 
{ 
    for (var i = 0; i < searchFields.length; ++i) { 
     if (record.get(searchFields[i]).toLowerCase().indexOf(searchText) !== -1) { 
      return true; 
     } 
    } 
    return false; 
}); 

しかし、私は有効になってページングでこれを達成することができますか?オーバーライドメモリプロキシ?

答えて

2

Ext.data.proxy.Memory.read使用Ext.util.Filter.createFilterFn:だから

// Filter the resulting array of records 
if (filters && filters.length) { 
    // Total will be updated by setting records 
    resultSet.setRecords(records = Ext.Array.filter(records, Ext.util.Filter.createFilterFn(filters))); 
    resultSet.setTotal(records.length); 
} 

、あなたは異なるフィルタロジックを使用したい場合は、することができます、アイデアのための

Ext.define('MyApp.extensions.FilterMemoryProxy', { 
    extend: 'Ext.data.proxy.Memory', 
    alias: 'proxy.filtermemory', 

    createCustomFilterFn: function (filters) 
    { 
     if (!filters) { 
      return Ext.returnTrue; 
     } 
     return function (candidate) 
     { 
      var items = filters.isCollection ? filters.items : filters, 
       length = items.length, 
       i, filter; 
      for (i = 0; i < length; i++) { 
       filter = items[i]; 
       if (!filter.getDisabled() && candidate.get(filter.getProperty()).toLowerCase().indexOf(
         filter.getValue().toLowerCase()) !== -1) { 
        return true; 
       } 
      } 
      return false; 
     }; 
    }, 

    read: function (operation) 
    { 

     ... 

     if (operation.process(resultSet, null, null, false) !== false) { 
      // Filter the resulting array of records 
      if (filters && filters.length) { 
       // Total will be updated by setting records 
       resultSet.setRecords(records = Ext.Array.filter(records, me.createCustomFilterFn(filters))); 
       resultSet.setTotal(records.length); 
      } 

     ... 

     } 
    } 
}); 
0

searchFieldsで指定されたフィールドの文字列のみを検索する場合は、convertメソッドが指定されたモデルに「仮想」フィールドを追加することができます。例えば

// Extend Ext.data.Model or create it. Dealer's choice. 
Ext.define('MyLocalModel', { 
    extend: 'Ext.data.model', 
    fields: [ 
     ... 
     { 
      name: 'searchField', 
      type: 'string', 
      convert: function(value, record) { 
       // Get search fields somewhere 
       var resultArray = []; 
       for (var i = 0; i < searchFields.length; ++i) { 
        var searchField = searchFields[i]; 
        var fieldValue = record.get(searchField); 
        resultArray.push(fieldValue); 
       } 

       // Join by a string that would not normally be searched 
       // so that field values 'foo' and 'bar' are not valid when searching 'ooba' 
       var result = resultArray.join('**'); 
       return result; 
      } 
     } 
    ] 
}); 

あなたが店でやらなければならないことは、次のとおりです。

store.filter('searchField', searchText); 

それはあなたが探しているものを正確にはありませんが、それは仕事を得る必要があります。 [](プロパティ値のコンフィグで)渡されたExt.util.Filterに基づいてフィルタ機能を作成するための

+0

おかげで、私は多くのデータを持っていると私は〜それはパフォーマンス(多分イム間違っている、イリノイチェック)影響を与える可能性が倍増することを考える:memroyプロキシ読みメソッドをオーバーライドして、カスタム関数を使用してフィルタ機能を作成しますだから私は別の解決策を見つけようとします。他の選択肢はありませんが、プロキシを無効にして2番目のストアを使用するように見えます。 –

+0

はい、それは理想的ではありません。データの大部分については、カスタムプロキシの作成をお勧めします。 – MarthyM

関連する問題