jqGrid afterclickPgButtons пропустить строку, где isLeaf non TRUE?

Я использую jqGrid 4.9.3-pre - бесплатный jqGrid от Олега.

Я использую:

  • контекстное меню
  • сетка деревьев
  • форма Править
  • множественный выбор: ложь

Код

treeGrid:true,
ExpandColumn:'name',
treedatatype:"json",
treeGridModel:"adjacency",
treeReader:{
   level_field: "level",
   parent_id_field: "parent",
   leaf_field: "isLeaf",
   expanded_field: "expanded",
   loaded:true,
},
loadonce: false

Как, если isLeaf is TRUE, пропустить строку и перейти к следующей строке, где isLeaf не равен TRUE?


person Andrei Demidow    schedule 29.02.2016    source источник
comment
Не могли бы вы точнее описать проблему? Например. какую версию бесплатной jqGrid вы используете, Вы писали о afterclickPgButtons. Обратный вызов существует в форме Edit или форме View. Что вы делаете? В чем ваша проблема: проверить, что новая строка является листовой, или перейти к следующей видимой нелистовой? afterclickPgButtons не имеют интерфейса для пропуска некоторых строк, но вы можете имитировать click на тех же (следующих или предыдущих) кнопках навигации формы внутри setTimeout   -  person Oleg    schedule 29.02.2016
comment
Кстати loaded:true в treeReader ложно. treeReader предоставляет имена свойств. Значение по умолчанию loaded: "loaded" правильное. Все остальные свойства treeReader имеют значения по умолчанию. Таким образом, вы можете пропустить там. Вы можете удалить loadonce: false, который игнорируется для TreeGrid, treedatatype:"json" обычно не требуется. Если у вас есть datatype: "json", то treedatatype:"json" будет автоматически. Таким образом, вы можете удалить treedatatype, treeReader и loadonce   -  person Oleg    schedule 29.02.2016
comment
Я настоятельно рекомендую вам скачать с здесь и использовать последнюю версию 4.13.0. Версия ` jqGrid 4.9.3-pre` означает ежедневную сборку в какой-то неуказанный день между выпусками 4.9.2 и 4.10.0.   -  person Oleg    schedule 29.02.2016
comment
перейти к следующему видимому нелисту   -  person Andrei Demidow    schedule 29.02.2016
comment
Спасибо, сейчас попробую   -  person Andrei Demidow    schedule 29.02.2016
comment
Вы используете форму просмотра или редактирования? Вы используете multiselect: true или нет?   -  person Oleg    schedule 29.02.2016
comment
Я использую форму редактирования. множественный выбор: ложь   -  person Andrei Demidow    schedule 29.02.2016
comment
Я вижу некоторые проблемы, которые могут возникнуть у вас с кнопками навигации в диалоговом окне «Редактировать» в случае использования с TreeGrid, но я все еще не полностью понимаю вашу конфигурацию. У вас загружены все узлы дерева в начале сетки? У вас есть редактируемые только листья? Я напишу вам ответ, который объясняет основную идею, что вы можете сделать. Вы можете реализовать себе именно то поведение, которое вам нужно.   -  person Oleg    schedule 29.02.2016
comment
Дополнительную информацию я разместил здесь   -  person Oleg    schedule 29.02.2016


Ответы (1)


Кнопки навигации формы Edit не имеют специального интерфейса, который позволял бы пропускать некоторые строки, но можно использовать onclickPgButtons, чтобы запретить переход к следующей/предыдущей строке и имитировать нажатие на ту же кнопку сразу после этого. Важно понимать, что jqGrid содержит скрытое поле в форме с id="id_g", которое будет использоваться при редактировании формы как rowid текущей строки редактирования. Таким образом, можно изменить значение скрытого поля перед моделированием click.

Соответствующая реализация обратного вызова onclickPgButtons может быть следующей:

onclickPgButtons: function (buttonName, $form, rowid) {
    var $self = $(this),
        iRow = $self.jqGrid("getGridRowById", rowid).rowIndex,
        isLeaf = $self.jqGrid("getGridParam", "treeReader").leaf_field,
        rows = this.rows,
        nRows = rows.length,
        iInc = buttonName === "next" ? 1 : -1,
        isNextRowVisibleLeaf = function () { // iRow - the current row
            var $nextRow = $(rows[iRow + iInc]),
                rowidNext = $nextRow.attr("id");
            if (rowidNext != null) {
                var nextItem = $self.jqGrid("getLocalRow", rowidNext);
                if (nextItem != null && nextItem[isLeaf] && $nextRow.css("display") !== "none") {
                    return true;
                }
            }
            return false;
        },
        $button = $(buttonName === "next" ? "#nData" : "#pData");

    if (isNextRowVisibleLeaf()) {
        return true; // nothing to do
    }
    // we need to fix the row, which the next row is visible leaf
    while (iRow < nRows && iRow > 0) {
        iRow += iInc;
        if (isNextRowVisibleLeaf()) {
            // set the value of hidden field of the form
            // to the id of the found row and simulate the click
            // on the same navigation button
            $form.find("#id_g").val($(rows[iRow]).attr("id"));
            setTimeout(function () {
                $button.click();
            }, 50);
            return false;
        }
    }
    return false;
}

См. демонстрацию.

person Oleg    schedule 29.02.2016