jqgrid маска редактировать - PullRequest
       2

jqgrid маска редактировать

3 голосов
/ 07 декабря 2011

Я использую jqgrid, где я хотел бы использовать встроенное редактирование и маскировать запись так, чтобы пользователю предлагалось ввести чч: мм, где чч = часы, а мм = минуты. Я использую плагин jquery с маской digitalBush. Проблема в том, что когда я вызываю его из initData, он перезаписывает текущие данные в этом поле. Я заметил, что это поведение отличается, когда вы используете модальную форму для редактирования. У кого-нибудь есть решение этой проблемы? Я назову маску с любого события, и я рад использовать любой доступный плагин. Насколько я могу судить, форматтер jqgrid не предоставляет настраиваемую маску, которая направляет запись пользователя в том формате, в котором она мне нужна. Также рад, что был неправ (конечно, с фрагментом кода для его поддержки).

Большое спасибо заранее.

Обновление: мне удалось собрать демонстрацию проблемы, с которой я столкнулся. S-O, очевидно, удаляет HTML, который я хотел обернуть, чтобы его можно было подключить и запустить как есть, так что вам нужно обернуть его в некоторый HTML, чтобы увидеть, как он работает. Еще раз спасибо за помощь. Вот код:

    <title>Mask Problem</title>

<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<link rel="stylesheet" type="text/css" href="http://ajax.googleapis.com/ajax/libs/jqueryui/1.8.16/themes/redmond/jquery-ui.css" />
<link rel="stylesheet" type="text/css" href="http://www.ok-soft-gmbh.com/jqGrid/jquery.jqGrid-4.2.0/css/ui.jqgrid.css" />
<script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.7.1/jquery.min.js"></script>
<script type="text/javascript" src="http://www.ok-soft-gmbh.com/jqGrid/jquery.maskedinput-1.3.min.js"></script>
<script type="text/javascript" src="http://www.ok-soft-gmbh.com/jqGrid/jquery.jqGrid-4.2.0/js/i18n/grid.locale-en.js"></script>
<script type="text/javascript" src="http://www.ok-soft-gmbh.com/jqGrid/jquery.jqGrid-4.2.0/js/jquery.jqGrid.src.js"></script>
    <script type="text/javascript">
        $.jgrid.no_legacy_api = true;
        $.jgrid.useJSON = true;

</script>
<script type="text/javascript">

    $(function () {
        var lastSel = -1;
        var mydata = [
            { HoursWorked: "0:00" },
            ];
        $.mask.definitions['5'] = '[0-5]';
        $.mask.definitions['2'] = '[0-2]';
        var $grid = $("#MyGrid");
        $grid.jqGrid({
            datatype: "local",
            data: mydata,
            height: 'auto',
            width: 700,
            colNames: ["Hours Worked"],
            colModel: [
                    { name: "HoursWorked", index: "HoursWorked", width: 85, editable: true, edittype: "text", editoptions: { size: 20, maxlength: 30,
                        dataInit: function (elem) {
                            $(elem).mask("29:59");
                        }
                    },
                        align: "center", editrules: { custom: true, custom_func: validHourEntry }
                    }
                  ],
            multiselect: false,
            caption: "My sample grid with Mask",
            rowNum: 10,
            cellEdit: true,
            rowList: [5, 10, 20],
            pager: '#MyGridpager',
            gridview: true,
            beforeSelectRow: function (rowid) {
                if (rowid !== lastSel) {
                    $(this).jqGrid('restoreRow', lastSel);
                    lastSel = rowid;
                }
                return true;
            },
            cellsubmit: "clientArray"
        }).jqgrid("navGrid", "#MyGrid", { add: false, del: false }); ;
    });




function validHourEntry(value, colname) {
    var editSuccess = true;
    var errorMsg = "";
    if (/^([0-1][0-9]|2[0-3]:[0-5][0-9])$/.test(value)) {
        return [true, ""];
    } else {
        return [false, "is wrong time.<br/>Please enter the time in the form <b>hh:mm</b>"];
    }
}


</script>

1 Ответ

7 голосов
/ 07 декабря 2011

Вы не разместили никакого кода, поэтому я попытался использовать digitalBush маскированный плагин jQuery для редактирования часов самостоятельно. Кажется, хорошая работа, и я получил

enter image description here

во встроенном редактировании или

enter image description here

в редактировании формы.

Я реализовал это следующим образом. Сначала я определил две маски: одну для ввода цифр от 0 до 2, а следующую маску для ввода цифр от 0 до 5:

$.mask.definitions['2']='[0-2]';
$.mask.definitions['5']='[0-5]';

и использовал следующее определение столбца «время» в сетке:

{name: 'time', index: 'time', width: 70, editable: true,
    editoptions: {dataInit: function (elem) { $(elem).mask("29:59"); }},
    editrules: {time: true}}

Я добавил проверку времени в отношении editrules: {time: true}, чтобы запретить ввод времени, например 27:20. Поскольку стандартное отображение времени проверки не является идеальным, ошибка появляется

enter image description here

мы можем улучшить результаты, используя пользовательскую проверку:

{name: 'time', index: 'time', width: 70, editable: true,
    editoptions: {dataInit: function (elem) { $(elem).mask("29:59"); }},
    editrules: {custom: true, custom_func: function (value) {
        if (/^([0-1][0-9]|2[0-3]:[0-5][0-9])$/.test(value)) {
            return [true, ""];
        } else {
            return [false, "is wrong time.<br/>Please enter the time in the form <b>hh:mm</b>"];
        }
    }}}

, который изменяет сообщение об ошибке проверки на следующее

enter image description here

Я уверен, что вы можете улучшить видимость с помощью другой настройки плагина маски и проверки. В любом случае мои эксперименты показывают, что можно успешно использовать плагин mask в jqGrid.

Вы можете увидеть демо здесь .

ОБНОВЛЕНО : Извините, Рон, что написал это, но код, который вы разместили, действительно хороший пример того, как нужно не писать программу и как нет использовать jqGrid. Вначале я не хотел писать какие-либо комментарии, но позже я решил описать вам, что не так в коде, и объяснить, как нужно модифицировать код.

Первая проблема в вашем коде состоит в том, что вы использовали объектный класс SampleJSObject вместо прямого использования функций. Из синтаксиса, как конструктор и методы объекта должны быть определены, код корректен, но ...

  • Какой смысл иметь общие настройки global внутри конструктора объекта. Йо использовал $.mask.definitions['5'] = '[0-5]'; например. При каждом создании экземпляра SampleJSObject глобальные настройки будут установлены или перезаписаны. Похоже, побочные эффекты.
  • Вы определили function SampleJSObject на верхнем уровне вашего кода, а не внутри $(document).ready, где вы его используете, поэтому вы определили global class.
  • Внутри $(document).ready вы определили неинициализированную переменную lastSel и попытаетесь инициализировать ее внутри function SampleJSObject, определенной в другой области видимости. Таким образом, переменная lastSel остается неинициализированной в $(document).ready, но вы устанавливаете другую глобальную переменную lastSel внутри конструктора.
  • Методы типа minutesToHours не имеют ничего общего с вашим классом SampleJSObject. Почему функция или calculateHoursAndMinutes должна быть членом класса? На мой взгляд, это ошибка в дизайне.
  • Метод init устанавливает только свойство jqgridParms. Вы можете сделать это таким же образом в конструкторе, но в обоих случаях мне не ясно, зачем нужен метод и метод, который определяет такие специфические параметры, как вы. Не думаю, что вы создадите более одного экземпляра такого специфического класса . Зачем нужен такой класс, где вам придется переписать практически любой метод для создания второго экземпляра класса?
  • В списке параметров jqGrid вы используете datatype: "local", но не используете параметр gridview: true и data, который позволяет создавать данные вместе с сеткой . Это улучшает производительность сетки во много раз, особенно для сеток с большим количеством рядов. Использование addRowData в loadGrid в качестве примера самого медленного метода. Более того, в случае rowNum: 10 будет проигнорировано, и локальная подкачка не будет выполнена.
  • метод calculateTotal демонстрирует, пожалуй, самую медленную реализацию виртуального столбца WeekTotal. Наиболее эффективной реализацией этой функции будет использование пользовательского форматера для столбца WeekTotal

    { name: "WeekTotal", index: "WeekTotal", width: 55, align: "center" , formatter: function (cellvalue, options, rowObject) { /* here you can access the other columns of the same row just as rowObject.SundayMinutes and return from the function the calculated WeekTotal value as string of HTML fragment */ }}

  • Если вам нужно использовать много столбцов с одинаковыми свойствами, вы можете определить шаблон столбца (см. здесь ):

    var myTimeTemplate = {width: 85, editable: true, edittype: "text", editoptions: { size: 20, maxlength: 30, dataInit: function (elem) { $(elem).mask("29:59"); }}

    и затем уменьшите определение столбца SundayMinutes, например, до

    {name: "SundayMinutes", template: myTimeTemplate }

...