18

AngularJS の ngGrid モジュールを使用して、ページ化されたデータを表示しています。複数の列を検索できるようにしたいのですが、OR 検索を使用します。

次の見出しを持つ列があるとしましょう:ID、名前、説明。検索すると、ID OR 名前 OR 説明のいずれかに検索語が含まれるすべての行が返されます。

    $scope.pagingOptions = {
        pageSizes: [20, 50, 100],
        pageSize: 20,
        totalServerItems: 0,
        currentPage: 1
    };

    $scope.gridOptions =
        {
            data: 'myData',
            columnDefs: [
                { field: 'id', displayName: 'Id' },
                { field: 'name', displayName: 'Name' },
                { field: 'description', displayName: 'Description' },
                { displayName: 'Actions', cellTemplate: '<input type="button" data-ng-click="doSomething(row.entity)" value="Do Something" />'}],
            enablePaging: true,
            showFooter: true,
            showFilter: true,
            pagingOptions: $scope.pagingOptions,
            filterOptions: {
                filterText: "",
                useExternalFilter: false
            }
        };

デフォルトの検索ボックスを使用してみました。また、$scope.filterText にバインドされた外部入力ボックスを使用して、次のようなカスタム フィルターを定義してみました。

$scope.filterUpdated = function () {
    $scope.gridOptions.filterOptions.filterText = 'id:' + $scope.filterText + ';name:' + $scope.filterText + ';description:' + $scope.filterText;
};

ただし、これはすべての列で AND を実行しているようです。ngGrid モジュールを使用して目的を達成することは可能ですか?

前もって感謝します、

クリス

4

1 に答える 1

8

はい、OR フィルターを実行することは可能ですが、ng-grid ソース コードを検索した後、filterOptions.filterText. これは AND フィルタリングのみを行うことができます。

解決策は、使用することですfilterOptions.useExternalFilter:true

また、その例も見つかりませんでしたが、少し遊んだ後、gridOptions.dataオブジェクト|配列を再作成することでフィルターが実際に行われるという考えが得られました。それがこのフィルターの唯一の欠点です。

プランカーコードはこちら

したがって、基本的にコードは次のindex.htmlのようになります。

<body ng-controller="MyCtrl">
  <strong>Filter Name:</strong> </string><input type="text" ng-model="filterName"/>
  </br>
  OR
  </br>
  <strong>Filter Age:</strong> </string><input type="text" ng-model="filterAge"/>
  </br>
  <button ng-click="activateFilter()">Run Filter</button>
  <br/>
  <br/>
  <div class="gridStyle" ng-grid="gridOptions"></div>
</body>

そして、あなたのcontroller.jsで:

app.controller('MyCtrl', function($scope) {

$scope.filterOptions = {
  filterText: '',
  useExternalFilter: true
};

$scope.activateFilter = function() {
  var name = $scope.filterName || null;
  var age = ($scope.filterAge) ? $scope.filterAge.toString() : null;
  if (!name && !age) name='';

  $scope.myData = angular.copy($scope.originalDataSet, []);
  $scope.myData = $scope.myData.filter( function(item) {
    return (item.name.indexOf(name)>-1 || item.age.toString().indexOf(age) > -1);
  });
 };

 $scope.originalDataSet = [{name: "Moroni", age: 50},
               {name: "Tiancum", age: 43},
               {name: "Jacob", age: 27},
               {name: "Nephi", age: 29},
               {name: "Enos", age: 34}];

 $scope.myData = angular.copy($scope.originalDataSet, []);

 $scope.gridOptions = {
  data: 'myData',
  filterOptions:  $scope.filterOptions
 };
});

これは単なる基本的なフィルタリングです (正規表現を使用するか、小文字に変換してより適切に一致させます)。また、名前と年齢の両方が空の場合、名前を '' に設定すると、すべての要素がフィルター内で true を返すことに注意してください (その結果、データセット全体が返されます)。

このオプションは、動的データセット ( read - server fed ) に適していますが、元のデータセットを複製してフィルターを適用する以外は同様に機能します。

于 2013-08-24T17:19:59.150 に答える