Extjs Comobobox Двойное поле отображения не разрешено устанавливать? - PullRequest
0 голосов
/ 02 марта 2012

Я новичок в Extjs 4.07.Я создал комбинированный (удаленный) запрос.В выпадающем списке отображается список курсов.Тем не менее, институт, в котором я работаю, недавно перекодировал их целые курсы.Итак, я получаю две записи с одним и тем же полем отображения.Мой JSON выглядит так:

{"result":[{"id":"90223","code":"CM12","description":"Introduction to C Programming","creditHours":"3.00","numberOfLabs":"0","contactHours":null,"chargeableCredits":null},
{"id":"2094","code":"CMPS1302","description":"Introduction to C Programming","creditHours":"3.00","numberOfLabs":"0","contactHours":null,"chargeableCredits":null}],"total":2}

поле отображения - описание, а поле значения - id.Когда я выбираю один из элементов в выпадающем списке и отправляю все работает нормально.Проблема возникает, если позже я выбрал неправильный курс и выбрал другой.

Я попытался установить idProperty: 'id', но безрезультатно.Когда я отправляю форму, значение, которое будет отправлено, будет выбрано первым после.Примечание: это происходит только для повторяющихся описаний курсов, все остальное работает нормально.

Вот код, помогающий объяснить проблему:

Ext.define('SIS.model.ManageCourse', {
    extend: 'Ext.data.Model',
    fields: [
        {name: 'id', type: 'int'},
        {name: 'code', type: 'string'},
        {name: 'description', type: 'string'},
        {name: 'creditHours', type: 'float'},
        {name: 'contactHours', type: 'float'},
        {name: 'chargeableCredits', type: 'float'},
        {name: 'numberOfLabs', type: 'float'},
        {name: 'selected', type: 'bool'} //for update course pre-requisites
    ]
});


Ext.define('SIS.store.ClassCourse', {
    extend: 'Ext.data.Store',
    autoLoad: true,
    autoSync: true,
    model: 'SIS.model.ManageCourse',
    pageSize: 7,
    remoteFilter: true,
    idProperty: 'id',
    proxy: {
        type: 'ajax',
        api: {
            read: 'course/select'
        },
        reader : {
            type : 'json',
            root : 'result',
            totalProperty  : 'total',
            successProperty : 'success'
        }
    }
});

Ext.define('SIS.view.class.ClassCourseCombo', {
    extend: 'Ext.form.ComboBox',
    alias: 'widget.ClassCourseCombo',
    name: 'courseId',
    fieldLabel: 'Course',
    store: 'ClassCourse',
    queryMode: 'remote',
    pageSize: 7,
    displayField: 'description',
    valueField: 'id',
    allowBlank: false,
    hideTrigger: true,
    forceSelection: true,
    minChars: 1,
    lazyInit: false,
    listConfig: {
        getInnerTpl: function () {
            return '<div class="combo-header">{description}</div>\
                <div class="combo-item">{code}</div>';
        }
    }
});

Ответы [ 2 ]

0 голосов
/ 10 марта 2012

Это ошибка, обнаруженная с версии 3, я нашел решение на форуме sencha , предоставленном Condor.

Я изменил строку

if(val.length > 0 && val != this.emptyText)

с

if(val.length > 0 && val != this.emptyText && typeof this.emptyText != 'undefined')

когда не определено emptyText, результат выглядит так, как если бы forceSelection был установлен в false, даже если явно установлен в true. Небольшое исправление.

0 голосов
/ 02 марта 2012

Наличие одинакового отображаемого значения для разных строк в поле со списком сбивает с толку, по крайней мере, для конечного пользователя. Почему бы вам не создать вычисляемое поле следующим образом:

fields: [
  { name: 'id', type: 'int' },
  { name: 'description', type: 'string' },
  { name: 'display', type: 'string', convert: function(v, r) {
     return r.get('id') + ' ' + r.get('description');
  }}
}]

И используйте это display в качестве вашего displayField.

...