2012-03-02 2 views
0

Я новичок, используя Extjs 4.07. Я создал combobox (remote) queryMode. В поле со списком отображается список курсов. Однако институт, в котором я работаю, недавно переработал все курсы. Итак, у меня есть две записи с одинаковым полем отображения. Мой JSON выглядит так:Неверное отображение поля отображения Extjs Comobobox не разрешено?

{"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. Когда я выбираю один из элементов в combobox и отправляю все работает нормально. Проблема возникает, если позже я выбрал неправильный курс и выберите другой.

Я пробовал установить 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>'; 
     } 
    } 
}); 
+0

Не могли бы вы объяснить вашу проблему на примере «Проблема возникает, если позже я выбрал неправильный курс и выберите другой». вызывает смущение. – Maggie

+0

Предположим, я хотел выбрать Intro для программирования на C (CM12), но я выбрал Intro to C Programming (CMPS1302) по ошибке. Несмотря на то, что я сделаю исправление, мой первый отбор будет представлен. Однако, если я выберу другой курс, например. Software Engineer, а затем выберите Intro to C Programming (CMPS1302), это приемлемо. – winkie

ответ

0

Это ошибка, идентифицированная с версии 3. Я нашел решение в sencha forum от Condor.

Я изменил линию

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

с

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

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

0

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

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.

+0

Я подумал об этом, но если это будет сделано, то при редактировании комбо результаты не будут возвращены, так как поле отображения используется в качестве запроса для получения результатов с сервера. Я решил использовать getInnerTpl для форматирования дисплея. – winkie

+0

Это тоже сработает ... – sha

Смежные вопросы