#extjs #extjs6 #extjs6-classic
#extjs #extjs6 #extjs6-классический
Вопрос:
Я хотел бы добавить средство выбора даты в текстовое поле как часть построителя выражений. Например. вы можете ввести что-то вроде:
date <= │
(где │
находится курсор)
затем щелкните триггер календаря, и когда выбрана дата, попросите его вставить дату в курсор:
date <= 2019-04-23│
Я посмотрел, как реализовано средство выбора даты, и там много материала, который мне пришлось бы скопировать.
Итак, тогда я думал о том, чтобы объединить скрытое поле даты, что-то вроде этого:
Ext.create('Ext.form.Panel', {
title: 'Expression Builder',
width: 400,
bodyPadding: 10,
renderTo: Ext.getBody(),
items: [{
xtype: 'textfield',
fieldLabel: 'Expression',
allowBlank: true,
triggers: {
calendar: {
cls: 'x-fa fa-calendar',
handler: function (me) {
var itemId = me.id '-aux-datefield';
var datefield = Ext.ComponentQuery.query('#' itemId)[0] ||
Ext.create({
itemId: itemId,
xtype: 'datefield',
hideLabel: true,
floating: true,
renderTo: me.getEl(),
alignTarget: me.id,
defaultAlign: 'tr-tr'
});
datefield.onTriggerClick();
}
}
}
}]
});
Дело в том, что если поле даты скрыто с помощью hidden: true
, то средство выбора не будет отображаться. Используя что-то хитрое вроде style: 'display: none'
, средство выбора выравнивается по верхнему левому краю окна просмотра. Измените maxHeight
и maxWidth
на что-нибудь маленькое, и размер поля даты изменится.
Это всего лишь одна из многих проблем, связанных с обработкой событий, вставкой курсора, уничтожением поля и т.д. так что работы тоже будет много.
Мне интересно, делал ли кто-нибудь что-то подобное, и, может быть, есть более простой способ?
Ответ №1:
Что-то вроде этого? :
Ext.application({
name: 'Fiddle',
launch: function () {
var myPicker = Ext.create('Ext.picker.Date', {
renderTo: Ext.getBody(),
floating: true,
defaultAlign: 't-b',
minDate: new Date(),
});
Ext.create('Ext.form.Panel', {
title: 'Expression Builder',
width: 500,
bodyPadding: 100,
renderTo: Ext.getBody(),
items: [{
xtype: 'textfield',
fieldLabel: 'Expression',
width: 300,
allowBlank: true,
triggers: {
calendar: {
cls: 'x-fa fa-calendar',
handler: function (me) {
var text = this
myPicker.handler = function (picker, date) {
text.setValue(text.getValue() ' ' Ext.Date.format(this.getValue(), 'd/m/Y'));
this.hide();
};
myPicker.showBy(this);
}
}
}
}]
});
}
});
Комментарии:
1. Это намного ближе, чем то, что у меня есть! Я добавил обработчик escape, и он отлично работает, спасибо!
Ответ №2:
Другим решением было бы расширить Ext.form.field.Сборщик, взгляните на Ext.form.field.Установите дату, чтобы увидеть, как это делается.
Или скопируйте исходный код для поля даты, см. Документ API, в свой собственный компонент, поскольку в нем есть необходимые компоненты для средства выбора, стиля, форматирования и т.д. Затем вы можете удалить проверку даты и форматирование даты.