Мы используем ExtJS для веб-приложения. В этом приложении мы используем стандартный элемент управления Ext.form.ComboBox
, когда требуется простое раскрывающееся меню, и элемент управления Ext.us.Andrie.Select
, когда нам требуется раскрывающееся меню, в котором можно выбрать несколько значений и / или очистить значение. Создание любого из них всегда требует набора шаблонного кода для параметров конфигурации, поэтому я хотел, чтобы класс, который сокращал шаблонный код, и пока я занимался этим, я хотел, чтобы этот класс мог генерировать либо простой выпадающий список, либо более продвинутый один, в зависимости от опции конфигурации (multi: true
или clearable: true
), но это оказалось намного сложнее, чем ожидалось.
Это самый близкий к мне рабочий результат:
MyComboBox = (function() {
var singleDefaults = {
typeAhead: false,
triggerAction: 'all',
selectOnFocus: false,
allowBlank: true,
editable: false,
delay: 700
};
var multiDefaults = {
typeAhead: false,
triggerAction: 'all',
selectOnFocus: false,
allowBlank: true,
editable: false,
delay: 700
};
var constructor = function(config) {
if (config.multi || config.clearable) {
config = Ext.apply(this, config, multiDefaults);
Ext.apply(this, Ext.ux.Andrie.Select.prototype);
Ext.apply(this, Ext.ux.Andrie.Select(config));
Ext.ux.Andrie.Select.prototype.constructor.call(this, config);
} else {
config = Ext.apply(this, config, singleDefaults);
Ext.apply(this, Ext.form.ComboBox.prototype);
Ext.apply(this, Ext.form.ComboBox(config));
Ext.form.ComboBox.prototype.constructor.call(this, config);
}
};
return function(config) {
this.constructor = constructor;
this.constructor(config);
};
})();
Ну, это не сбой , но на самом деле это тоже не работает. Когда он настроен на поведение, подобное Ext.ux.Andrie.Select
, он хочет загрузить хранилище, даже когда он загружен, не раскрывает раскрывающийся список, пока вы не начнете вводить данные в поле.
Еще один подход, который был опробован, был что-то вроде:
MyComboBox = Ext.extend(Ext.form.ComboBox, {
constructor: function(config){
if (config.multi || config.clearable) {
Ext.form.ComboBox.prototype.constructor.call(this, config);
} else {
Ext.ux.Andrie.Select.prototype.constructor.call(this, config);
}
}
});
Это не работает, потому что выпадающий список Andrie не определяет собственную функцию constructor
, поэтому он в конечном итоге вызывает функцию-конструктор Ext.form.ComboBox
, от которой он наследует, что приводит к нормальному выпадающему списку, а не выпадающий список
Полагаю, это специфично для ExtJS, но если у вас есть подход, не зависящий от фреймворка, я могу перевести его на ExtJS.