Как заставить виджет текстового поля внутри сетки работать?

Я поместил виджет текстового поля внутри ячейки сетки с помощью средства форматирования. Однако я не могу перемещать курсор и выбирать текст внутри текстового поля.

Например. http://jsfiddle.net/g33m9/69/

Кто-нибудь знает, как это исправить?

Спасибо


person Michael    schedule 06.07.2012    source источник


Ответы (1)


Вам нужно установить столбец как 'редактируемый', чтобы компонент Grid знал, как обрабатывать события нажатия клавиш. Так что модификация макета в порядке

от

var layout = [[
        {name: 'Column 1', field: 'col1'},
        {name: 'Column 2', field: 'col2', width:'200px', formatter: func}
    ]]; 

to

var layout = [[
        {name: 'Column 1', field: 'col1'},
        {name: 'Column 2', field: 'col2', width:'200px', formatter: func, editable: true}
    ]]; 

Состояние редактирования активируется двойным щелчком.

Теперь OP хочет, чтобы это был полностью раздутый виджет, появляющийся в редактируемом состоянии. Чтобы это можно было масштабировать с любым количеством строк/столбцов, я ограничу это состоянием edit, чтобы значение просто отображало текст, но после двойного щелчка по нему появится FilteringSelect. Тот же принцип работает с диджит-виджетом ValidationTextBox.

В настоящее время (1.7.2) возможные типы ячеек: dojox.grid.cells.Bool dojox.grid.cells.ComboBox dojox.grid.cells.DateTextBox dojox.grid.cells.Select

Поймай меня SEO:

пример пользовательского виджета dojox.grid cellType — полупрограммный

Первый шаг - создайте некоторые данные

var i = 0,
data = {
    identifier: 'id',
    items: [
      { id: i, value: 'val'+i++},
      { id: i, value: 'val'+i++},
      { id: i, value: 'val'+i++},
      { id: i, value: 'val'+i++}
    ]
},
// The item label which holds visible value and which holds the value to represent
searchAttr = 'value',
valueAttr = data.identifier,
// The store to use for select widget
store = new dojo.data.ItemFileReadStore({ data: data }),
// And the options, reassembling the valid options we will present in dropdown
// Used when cellType is dojox.grid.cells.Select to name the allowable options
options = [];
dojo.forEach(data.items, function(it) { options.push(it[searchAttr])});

Сложная часть — определить тип ячейки

Давайте расширим существующий dojox.grid.cells.Cell, у него есть две ключевые функции - средство форматирования состояния редактирования и средство форматирования по умолчанию. По умолчанию будет работать нормально. И последнее, но не менее важное: мы переопределим функцию «_finish», хотя и позволим ячейке обрабатывать свое собственное определение.

var whenIdle = function( /*inContext, inMethod, args ...*/ ) {
    setTimeout(dojo.hitch.apply(dojo, arguments), 0);
};

var FilteringSelectCell = declare("dojox.grid.cells.FilteringSelect", [dojox.grid.cells.Cell], {
    options: null,
    values: null,

    _destroyOnRemove: true,
    constructor: function(inCell){
        this.values = this.values || this.options;
    },

    selectMarkupFactory: function(cellData, rowIndex) {
        var h = ['<select data-dojo-type="dijit.form.FilteringSelect" id="deleteme' + rowIndex + '" name="foo">'];
        for (var i = 0, o, v;
        ((o = this.options[i]) !== undefined) && ((v = this.values[i]) !== undefined); i++) {
            v = v.replace ? v.replace(/&/g, '&amp;').replace(/</g, '&lt;') : v;
            o = o.replace ? o.replace(/&/g, '&amp;').replace(/</g, '&lt;') : o;
            h.push("<option", (cellData == v ? ' selected' : ''), ' value="' + v + '"', ">", o, "</option>");
        }
        h.push('</select>');
        return h;
    },
    textMarkupFactory: function(cellData, rowIndex) {
        return ['<input class="dojoxGridInput" id="deleteme' + rowIndex + '" data-dojo-type="dijit.form.ValidationTextBox" type="text" value="' + cellData + '">']

    },
    // @override
    formatEditing: function(cellData, rowIndex) {

        this.needFormatNode(cellData, rowIndex);
        var h = (cellData == "W1")
            ? this.textMarkupFactory(cellData, rowIndex)
            : this.selectMarkupFactory(cellData, rowIndex);
        // a slight hack here, i had no time to figure out when the html would actually be inserted to the '<td>' so.. Use 'debugger' statement and track function to hook into
        whenIdle(function() {
            dojo.parser.parse(dojo.byId('deleteme' + rowIndex).parentNode);
            var w = dijit.byId('deleteme' + rowIndex);
            w.focus()

        });
        return h.join('');
    },
    // clean up avoiding multiple widget definitions 'hanging'
    _finish: function(inRowIndex) {
        this.inherited(arguments)
        dijit.byId('deleteme' + inRowIndex).destroy();
    },
    // needed to read the value properly, will work with either variant
    getValue: function(rowIndex) {
        var n = this.getEditNode(rowIndex);
        n = dijit.getEnclosingWidget(n);
        return n.get("value");
    }
});

Последний бит, новый макет

var layout = [[
      { name: 'Column 1', field: 'col1' },
      { name: 'Column 2', field: 'col2', 
        cellType: FilteringSelectCell, options: options, editable: true
      }
]];

Запуск примера здесь http://jsfiddle.net/dgbxw/1/

person mschr    schedule 08.07.2012
comment
Здравствуйте, спасибо за ответ, но в моей ситуации это не помогло. При двойном щелчке функциональность виджета будет потеряна; например, если у меня есть текстовое поле или поле со списком проверки, после двойного щелчка проверка не будет работать или поле со списком исчезнет. - person Michael; 09.07.2012
comment
хорошо, тогда более подробный ответ - сетка ограничена тремя типами ячеек, как есть. Чтобы добиться идеальной имитации ValidationTextBox в ячейке, вам нужно будет расширить dojox.grid.cells.Cell. Я приведу образец, начиная с dojox.grid.cells.Select - person mschr; 09.07.2012
comment
Можете ли вы расширить свой ответ дальше. То, как я это делаю, несколько нестандартно. Мне нужно, чтобы разные виджеты отображались в одном и том же столбце в зависимости от типа значения в поле. Например. Для столбца 2, строки 1 я хочу отобразить поле со списком. Для столбца 2, строки 2 я хочу отобразить поле проверки. Для столбца 2, строки 3 я хочу отобразить флажок и т. Д. То, как вы описываете, заставит все строки одного и того же столбца быть одного типа. - person Michael; 09.07.2012
comment
То, как я делаю это прямо сейчас, заключается в том, чтобы не указывать тип ячейки. Затем в средстве форматирования: если тип значения равен x, создайте [var comboBox = new dijit.form.ComboBox] и верните эту переменную; если тип значения — y, создайте [var textBox = new dijit.form.ValidationTextBox] и верните эту переменную. Таким образом, я могу отображать разные виджеты в одном и том же столбце. ОДНАКО, у меня странное поведение, например, я не могу поместить курсор в текстовое поле и т. д. (как вы можете видеть в jsfiddle.net/g33m9/69). Вы думаете, я работаю в тупик? Любое обходное решение вообще? - person Michael; 09.07.2012
comment
да, я думаю - своего рода тупик .. Дизайн, который вы ищете, представляет собой трансформирующийся макет, будет довольно сложно поймать его в нужный момент. Вместо этого вы должны сделать так, чтобы пользовательский тип ячейки создавал либо 1: выбор, либо 2: текстовое поле ввода в функции formatEditing. - person mschr; 09.07.2012
comment
Еще раз спасибо за ваш расширенный ответ. Позволяет ли ваше решение отображать разные виджеты в одном и том же столбце. Для простоты, допустим, строка 1 field.value=1 в столбце [2] я хочу отобразить поле проверки, если строка 2 field.value=2 в том же столбце [2] я хочу отобразить поле со списком. Как вы думаете, сможете ли вы добавить эту основную функциональность в свое решение? (если вы можете создать jsfiddle, это будет бонусом; если нет, это тоже круто). Спасибо - person Michael; 09.07.2012
comment
Да, это достаточно просто, средство форматирования ячеек возвращает html, а приведенный выше дизайн просто запускает парсер dojo. При использовании виджета dijit.form это также достаточно просто, чтобы получить значение. На самом деле, вы можете реализовать практически любой виджет cellType :D - person mschr; 09.07.2012
comment
Ваше новое опубликованное решение выглядит очень многообещающе, позвольте мне попробовать его в моем реальном проекте, и я отчитаюсь, спасибо! - person Michael; 09.07.2012
comment
Ваше решение потрясающее, очень продвинутое. Самое главное, это работает! Я застрял на несколько недель ... поэтому я очень ценю время, которое вы потратили на это решение. Большое спасибо! - person Michael; 09.07.2012
comment
хотелось бы просто оставить ;) если бы было достаточно символов хе-хе - person mschr; 09.07.2012