04.06.2019, 17:20
|
Аспирант
|
|
Регистрация: 12.11.2015
Сообщений: 68
|
|
Фильтрация значений combobox
Приветствую.
Для поля combobox, в окне редактирования, необходимо сделать так что бы поле изменялось только на одно значение вверх или вниз, как при создании новой записи или при редактировании.
....
{
xtype: 'combobox',
name: 'status',
fieldLabel: 'Status',
displayField: 'name',
valueField: 'id',
queryMode: 'local',
store: new Ext.data.ArrayStore({
id: 0,
fields: ['id','name'],
data: [[1, 'Новая'], [2, 'В работе'], [3, 'В ожидании'], [4, 'Закрытая'], [5, 'Архивная']]
}),
listeners: {
'select': function (combo, record) {
index = record.internalId;
filterCombo(combo, index);
},
'render': function (combo) {
//index = combo.getSelection().internalId;
//filterCombo(combo, index);
}
}
},
....
Делаю при помощи событий select и render. Функция filterCombo выглядит так:
function filterCombo(combobox, index) {
store = combobox.getStore();
store.clearFilter();
store.filterBy(
function(record) {
if ((record.internalId == index - 1) || (record.internalId == index) || (record.internalId == index + 1)) {
return true;
} else {
return false;
}
}
);
}
1. При выполнении render , ругается на combo.getSelection() (ReferenceError: index is not defined). Почему?
2.Возможно ли реализовать данную логику более лаконично, к примеру во ViewController в методах addItem, editItem . Т.е фильтровать стор в момент открытия формы на добавление/редактирование, или это вариант не очень?
3. Если остановиться на 1ом пункте, то куда наиболее правильно будет вынести функцию filterCombo что бы не оставлять ее в представлении App.view.TestEdit
Пример на Fiddle
Спасибо
|
|
10.06.2019, 19:33
|
Лаборант :-)
|
|
Регистрация: 08.11.2011
Сообщений: 806
|
|
Сообщение от Ambassador
|
Для поля combobox, в окне редактирования, необходимо сделать так что бы поле изменялось только на одно значение вверх или вниз, как при создании новой записи или при редактировании.
|
Не понятно.
Что должно получиться?
|
|
18.06.2019, 11:34
|
Аспирант
|
|
Регистрация: 12.11.2015
Сообщений: 68
|
|
Сообщение от Pavel M.
|
Не понятно.
Что должно получиться?
|
Для выбора должно быть доступно только значение на одно больше или меньше , к примеру вот весь список значений комбы:
'Новая'
'В работе'
'В ожидании'
'Закрытая'
'Архивная'
необходимо что бы было так:
если пустое значение то:
'Новая'
если выбрано Новая то
'Новая'
'В работе'
если выбрано 'В работе' то:
'Новая'
'В работе'
'В ожидании'
если выбрано 'В ожидании' то:
'В работе'
'В ожидании'
'Закрытая'
|
|
18.06.2019, 15:40
|
|
Профессор
|
|
Регистрация: 06.06.2014
Сообщений: 292
|
|
Мне кажется, вам надо держать полный список значений в одном сторе, а в комбике использовать другой, чейновый с фильтром: https://docs.sencha.com/extjs/6.7.0/...ml#cfg-filters
Напишите должный фильтр и готово.
Еще вариант - отказатсья от комбика. А почему бы и нет? Для выставления всего двух статусов достаточно двух кнопок.
|
|
19.06.2019, 15:57
|
Аспирант
|
|
Регистрация: 12.11.2015
Сообщений: 68
|
|
Добрый день.
Pavel M. - Сделал по вашему примеру так:
....
{
....
store: Ext.create('Ext.data.Store', {
fields: ['id', 'name', 'show'], // в show массив с id, которые показываем при выборе этого пункта
data: [
{id:1, name:"Пункт 1", show:[1, 2]},
{id:2, name:"Пункт 2", show:[1, 2, 3]},
{id:3, name:"Пункт 3", show:[2, 3, 4]},
{id:4, name:"Пункт 4", show:[3, 4, 5]},
{id:5, name:"Пункт 5", show:[4, 5, 6]},
{id:6, name:"Пункт 6", show:[5, 6]}
]
}),
listeners: {
render: function (combo){
store = combo.getStore();
store.filter('id', 1);
},
select: function (combo, rec) {
store = combo.getStore();
store.clearFilter(true);
store.filter({
property: 'id',
operator: 'in',
value: rec.get('show')
});
}
}
},
.....
Пример в fiddle
При создании новой записи работает как и требуется, но если редактируем имеющуюся,
то событие select срабатывает только когда выбран уже элемент, соответственно фильтрации по значениям 'show' не происходит.
По идее, если перенести фильтрацию в render, то можно добиться необходимого, но при этом мне обязательно нужно получать установленное значение комбы,
и вроде так должно работать, но как мне получать в render текущую запись?
listeners: {
render: function (combo){
currentRec.get('show')//currentRec - Должна быть установленная запись, но как мне ее получить в render ?
if(Ext.Object.isEmpty(currentRecShow)){
store = combo.getStore();
store.filter('id', 1);
}
else{
store = combo.getStore();
store.clearFilter(true);
store.filter({
property: 'id',
operator: 'in',
value: currentRec.get('show')//rec.get('show')
});
}
},
}
Возможно что мой вариант абсолютно не правильный. Тогда как сделать наиболее верное решение?
|
|
19.06.2019, 16:00
|
Аспирант
|
|
Регистрация: 12.11.2015
Сообщений: 68
|
|
Сообщение от Infarch
|
Мне кажется, вам надо держать полный список значений в одном сторе, а в комбике использовать другой, чейновый с фильтром: https://docs.sencha.com/extjs/6.7.0/...ml#cfg-filters
Напишите должный фильтр и готово.
Еще вариант - отказатсья от комбика. А почему бы и нет? Для выставления всего двух статусов достаточно двух кнопок.
|
Спасибо
|
|
22.06.2019, 21:16
|
Лаборант :-)
|
|
Регистрация: 08.11.2011
Сообщений: 806
|
|
Ambassador,
кто мешает, например, при открытии окна устанавливать фильтр комбобокса?
пример https://fiddle.sencha.com/#view/editor&fiddle/2t9o
попробуйте выбрать значение в комбо, закрыть окно и открыть заново
Последний раз редактировалось Pavel M., 22.06.2019 в 21:19.
|
|
09.07.2019, 12:55
|
Аспирант
|
|
Регистрация: 12.11.2015
Сообщений: 68
|
|
Сообщение от Infarch
|
Мне кажется, вам надо держать полный список значений в одном сторе, а в комбике использовать другой, чейновый с фильтром: https://docs.sencha.com/extjs/6.7.0/...ml#cfg-filters
Напишите должный фильтр и готово.
Еще вариант - отказатсья от комбика. А почему бы и нет? Для выставления всего двух статусов достаточно двух кнопок.
|
Если реализовывать с помощью двух кнопок, то где можно подобный пример посмотреть? Или какой именно компонент использовать ?
Полагаю что нужен
xtype: 'segmentedbutton'
но тогда как в него подгружать значение поля status_id и id статусов доступные для переключения
|
|
10.07.2019, 10:06
|
|
Профессор
|
|
Регистрация: 06.06.2014
Сообщений: 292
|
|
Вы могли бы использовать actioncolumn в гриде. Вот кусок кода из одного проекта:
{
xtype: 'actioncolumn',
width: 50,
align: 'center',
items: [
{
icon: '/images/company7/desktop_toolbar_undo.gif',
tooltip: Localtext.heading.revert_to_draft,
getClass: function(v, meta, record){
if( ! record.isRound || record.get('IsDraft') ) return 'x-hidden-display';
},
handler: 'doRevert'
}
]
}
Фишка вот в чем: создаете айтемы для всех возможных значений, но прячете неподходящие с помощью функции getClass. Когда хендлер сменит поле строки, getClass снова вызовется и обновит грид.
|
|
|
|