Выберите столбец в сетке кендо, не работает на расширенном виджете - PullRequest
0 голосов
/ 01 октября 2019

Я создал расширенную версию сетки Kendo.

var base = kendo.ui.Grid;

var CustomGrid = base.extend({
    init: function (element, options) {
        var that = this;            
        base.fn.init.call(that, element, options);
    },
    options: {
        name: "CustomGrid"
    }

Сетка расширяется, а не инкапсулируется в компонент. Контроль был сделан довольно поздно во время процесса разработки, и, среди прочего, это привело к наименьшему количеству переделок нашего кода.

В этой сетке я хочу столбец Selectn, который изначально поддерживается Kendo начиная с версии Kendo UI R2 2017 SP1 . Моя проблема в том, что, хотя флажки правильно отображаются на сетке, (не) проверка их не (не) выбирает строки. Я предполагаю, что базовая функциональность ищет объекты с определенными значениями атрибутов, которые отличаются в моем настраиваемом виджете. Например, сетка Kendo будет иметь data-role='grid', а моя - data-role='customgrid'.

Я попытался создать свой собственный столбец выбора, используя в качестве руководства документацию Telerik . Хотя это работает, он только обрабатывает основы. Это становится более сложным, когда вы добавляете сортировку, фильтрацию и т. Д.

Что мне нужно сделать, чтобы встроенный столбец выбора работал для расширенной сетки Kendo?

Ответы [ 2 ]

0 голосов
/ 04 октября 2019

У моей работы есть лицензия, и я также задал вопрос о поддержке Telerik. Они ответили вчера, и их ответ, кажется, работает хорошо! Перефразировано ниже:

Внутренне у нас есть условие, которое проверяет, принадлежит ли текущая выбранная строка к текущей сетке, чтобы избежать выбора строк родительских сеток в контексте иерархических сеток. Однако getKendoGrid не будет возвращать экземпляр виджета, когда сетка настроена. В качестве обходного пути я могу предложить вам переопределить функции сетки _checkboxClick и _headerCheckboxClick.

kendo.ui.Grid.fn._checkboxClick = function (e) {
    var that = this,
        row = $(e.target).closest("tr"),
        isSelecting = !row.hasClass('k-state-selected');

    if (!that.dataSource.getByUid(row.attr('data-uid'))) {
        return;
    }

    if (isSelecting) {
        that.select(row);
    } else {
        that._deselectCheckRows(row);
    }
}

kendo.ui.Grid.fn._headerCheckboxClick = function (e) {
    var that = this,
        checkBox = $(e.target),
        checked = checkBox.prop("checked");

    if (!that.thead.find(checkBox).length) {
        return;
    }

    if (checked) {
        that.select(that.items());
    } else {
        that.clearSelection();
    }
}
0 голосов
/ 02 октября 2019

Если у вас есть лицензия Kendo, загрузите исходный код и проверьте метод закрытой сетки _persistSelectedRows. Они отслеживают идентификаторы. Вот где это становится сложным: недавно добавленные элементы (еще не сохраненные в базе данных) могут не иметь идентификатора. Если вы назначите им идентификаторы, источник данных не увидит их как новые элементы для сохранения. Если вы этого не сделаете, вы не можете продолжать их выбор. Вместо этого вы можете сохранить UID, но если вы обновите сетку, UID будет сгенерирован заново, и ваш выбор будет потерян.

В итоге мы создали собственный менеджер выбора, основанный на uids, но это собственный код, которым я не могу поделиться.

Поскольку сетка подразумевает, что у вас есть лицензия, я предлагаю вамвоспользоваться поддержкой Кендо.

...