ExtJS использует Roweditor с комбо не работает должным образом - PullRequest
2 голосов
/ 12 января 2012

У меня есть ExtJS Grid.И я использую плагин Roweditor с combobox.Когда я нажимаю на любую строку таблицы, я вижу кнопку «Редактор с обновлением и отменой».

Теперь проблема, с которой я сталкиваюсь, заключается в том, что я нажимаю на строку, и редактор строк включается, еслитекущее отображаемое значение соответствует комбинированному хранилищу, затем оно должно отображаться как выбранное, но оно не отображается.Если я использую значение как для valueField, так и для displayField, я вижу, что оно выбрано.

Наверное, я не могу опубликовать изображения, поэтому я даю вам код здесь:

Если я использую значение для valueField и displayField в Combo's Store, тогда я вижу выбранное значение.

editor: {
    allowBlank: true,
    selectOnFocus:true,
    editable:true,
    xtype:'combobox',
    valueField:'id',
    displayField:'status',
    triggerAction:'all',
    queryMode: 'local',
    store:[['NOT_STARTED','NOT_STARTED'],
           ['IN_PROGRESS','IN_PROGRESS'],
           ['COMPLETED','COMPLETED']
    ],
    value:0,
    lazyRender: true
}

Когда я назначаю displayField и valueField по-разному в Combo'sМагазин, который является идеальным случаем, он не показывает мне выбранный.

editor: {
    allowBlank: true,
    selectOnFocus:true,
    editable:true,
    xtype:'combobox',
    valueField:'id',
    displayField:'status',
    triggerAction:'all',
    queryMode: 'local',
    store:[['1','NOT_STARTED'],
           ['2','IN_PROGRESS'],
           ['3','COMPLETED']
    ],
    value:0,
    lazyRender: true
}

Пожалуйста, скажите мне, что здесь не так.


Привет Спасибо за ответ, у меня естьсделал изменения, как вы предлагаете, но почему-то это не сработало для меня.Вот кодекс.Мой магазин

 var data = {
            root: [
                                                {
                                                    "objectType":"com.yagna.common.domain.Project",
                                                    "objectId":"3072",
                                                    "expectedEndDate":"",
                                                    "startDate":"2011-06-27 13:06:00.0",
                                                    "name":"Milestone-11",
                                                    "actualEndDate":"",
                                                    "id":"4376",
                                                    "Status":"NOT_STARTED"
                                                }] };  

                                                                                     my Column is 

{id: 'Status',width: 20,text: 'Status',dataIndex: 'Status',filter: {type: 'combobox'},sortable: true, groupable: false,
        editor:{
                allowBlank: true,
                xtype:'combobox',
                valueField:'field1',
                displayField:'field2',
                triggerAction:'all',
                mode: 'local',
                store: [['0','NOT_STARTED'],['1','IN_PROGRESS'],['2','COMPLETED']],
                value:0,
                lazyRender: true
            } },   

                                                   Please suggest what is missing here

1 Ответ

4 голосов
/ 13 января 2012

"Если отображаемое в данный момент значение соответствует комбинированному хранилищу, то должен отображаться как выбранный, но это не означает, что "

Поле со списком не совпадает со значением displayField, оно совпадает со значением valueField.

Хранилище данных комбинированного списка, которое жестко запрограммировано как ваше, автоматически примет первый элемент (например, «1») как valueField, а второй элемент (например, «NOT_STARTED») как displayField.

Поскольку ни одно из «числовых» значений («1», «2», «3») не соответствует значениям в этом столбце («NOT_STARTED», «IN_PROGRESS», «COMPLETED»), он ничего не показывает.

Если я не понял это неправильно, похоже, что хранилище данных для самой сетки содержит эти данные столбца "status" (или как вы называете этот столбец) в виде строки, а не числа (то есть "NOT_STARTED", "IN_PROGRESS", «ЗАВЕРШЕНО» вместо 1, 2, 3).

Вы можете сделать две разные вещи:

EASIEST: Просто оставьте поле значения в виде строки, не делайте ее числом.

HARDER: Если вам действительно нужно, чтобы это был номер по некоторой (неустановленной) причине:

  1. Вы изменяете данные в сетке , так что все данные для этого столбца вместо строки используется число (1,2,3).
  2. Добавьте конфигурацию renderer в этот столбец, чтобы отображать числа в виде соответствующие строки, когда строка не редактируется.
  3. Затем сделайте так, как вы пытаетесь с настройкой хранилища данных, как [number - string] объектов. Кроме того, возьмите номер из кавычек в вашем магазине, если ты собираешься делать это таким образом.

Конечно, если вы уже используете конфигурацию renderer в этом столбце, проблема может заключаться в том, что у вас есть число в кавычках.

Надеюсь, все это имеет смысл.

EDIT:

Вот код.

Сначала поместите элементы статуса в отдельное хранилище - вот так:

var statusStore = Ext.create('Ext.data.SimpleStore', {
    fields: ['id', 'status'],
    data : [
        ['0', 'NOT_STARTED'],
        ['1', 'IN_PROGRESS'],
        ['2', 'COMPLETED']
    ]
});

Во-вторых, измените значение «status» на требуемую цифру («0»)

var data = {
    root: [{
        "objectType":"com.yagna.common.domain.Project",
        "objectId":"3072",
        "expectedEndDate":"",
        "startDate":"2011-06-27 13:06:00.0",
        "name":"Milestone-11",
        "actualEndDate":"",
        "id":"4376",
        "Status":"0"
    }]
};  

В-третьих, добавьте средство визуализации в конфигурацию вашего столбца и измените хранилище, указанное в редакторе, на то, которое мы создали выше (statusStore).

{
    id: 'Status',
    width: 20,
    text: 'Status',
    dataIndex: 'Status',
    filter: {type: 'combobox'},
    sortable: true, 
    groupable: false,
    // add this renderer
    renderer: function(value) {
        var idx = statusStore.find('id', value)
        var rec = statusStore.getAt(idx);
        return rec.get('status');                    
    },
    editor:{
        allowBlank: true,
        xtype:'combobox',
        valueField:'field1',
        displayField:'field2',
        triggerAction:'all',
        mode: 'local',
        // change this store to refer to the one we created
        store: statusStore,
        value:0,
        lazyRender: true
    }
},       

Если это сработает, не забудьте отметить чек на ответ слева.

...