0

カスタム フィルター関数を作成する必要があります。名前、年齢、都市など、複数の列を持つ剣道グリッドがあります。名前列は複数選択する必要があります。ここで、フィルタリングする場合、グリッド全体のロジックは「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
    }
}

注目に値するいくつかのこと

  1. コンソールに何も表示されないため、カスタム フィルター関数が実行されないようです。
  2. このフォーラムの投稿に続いて、このコードは非常に単純に見えます:

    operator: function(item, value){ //ロジックを実装する }

それが十分に文書化されておらず、パラメータ「item」と「value」が何であるか、またはそれらがどこから来たのかわからないことを除いて。

4

1 に答える 1

0

少し遅いですが気にしないでください。タグを適切にクリアするために、次のことを追加しました

  1. 次のように、複数選択オブジェクトの dom 要素に id プロパティを追加しました。

 function getteamplate(args) {
    args.element[0].id = "<<filterElementID>>";
    args.element.kendoMultiSelect({
                dataSource: args.dataSource,
                .............

  1. グリッドの dataSource dataBound イベントにチェックを追加し、dataSource フィルターに「MultiSelect」フィルター (filter.field = name) が含まれていない場合は常に dom 要素の値をクリアするようにしました。

if(!_.find(this.dataSource.filter() ? this.dataSource.filter().filters : [] , 
                function(filter){
                    return filter.field == "name"
                }))
            $("#<<filterElementID>>").data().kendoMultiSelect.value([]);

于 2016-09-12T09:01:26.883 に答える