カスタム フィルター関数を作成する必要があります。名前、年齢、都市など、複数の列を持つ剣道グリッドがあります。名前列は複数選択する必要があります。ここで、フィルタリングする場合、グリッド全体のロジックは「and」である必要がありますが、その特定の列 (名前) には「or」ロジックが必要です。
この投稿と他の同様の投稿をいくつか見ました。この例では、テレリックはデータバインド属性を削除することを提案しています
element.removeAttr("data-bind");
複数選択フィールドからすべてのタグをクリアするまで、これは非常にうまく機能します。参考までに、グリッドは filterMode: "row" として構成されています。このシナリオでは、タグはまったくクリアされません。
そこで、ここでカスタム フィルター関数を作成しようとしています。これが私がこれまでに持っているものです:
filterable: {
multi: true,
cell: {
template: function getteamplate(args) {
args.element.kendoMultiSelect({
dataSource: args.dataSource,
dataTextField: "name",
dataValueField: "name",
change: function change(e) {
var dataSource = $scope.grid.dataSource;
// if filters are not yet set, do so now
if (!dataSource.filter()) {
$scope.grid.dataSource.filter({
logic: "and",
filters: []
});
}
var dataFilters = dataSource.filter().filters;
var values = this.value();
if (values.length > 0) {
$log.log("filtering");
var newFilter = {
field: "name",
operator: function operator(item, value) {
$log.log("Item: " + item);
$log.log(value());
var found = false;
value().forEach(function forEach(element) {
$log.log("Value: " + element);
if (item.indexOf(element) !== -1) {
found = true;
}
});
return found;
},
value: values,
fieldName: "dataSource"
};
dataFilters.push(newFilter);
$log.log(dataFilters);
}
dataSource.filter({
logic: "and",
filters: dataFilters
});
}
});
//args.element.removeAttr("data-bind");
},
showOperators: false
}
}
注目に値するいくつかのこと
- コンソールに何も表示されないため、カスタム フィルター関数が実行されないようです。
このフォーラムの投稿に続いて、このコードは非常に単純に見えます:
operator: function(item, value){ //ロジックを実装する }
それが十分に文書化されておらず、パラメータ「item」と「value」が何であるか、またはそれらがどこから来たのかわからないことを除いて。