combobox и значение null (аля вариант "не выбрано")
Как мне сделать, чтобы в combobox-е можно было выбрать значение null?
То есть чтобы display значение было к примеру Не выбрано, а value значение было именно null, чтобы потом в базу данных NULL попал, а не что-то иное. Такие варианты не подходят http://stackoverflow.com/questions/9...extjs-combobox |
пример не буду писать (на работу вышел после отпуска), но в общих чертах: на листенер load стора, можно дописать в стор нулевую запись, в которой будет только "видимое значение".
|
это вы предлагает чтобы id у этой записи был равен null???
|
Задача нередко встречается...
Если в форме указан параметр url и она отправляется через form.submit(), то уходит пустая строка, даже если определить для поля emptyText и передать в submit({submitEmptyText: false}). Ибо в коде написано: getParams: function(useModelValues) { var falseVal = false, configParams = this.callParent(), fieldParams = this.form.getValues(falseVal, falseVal, this.submitEmptyText !== falseVal, useModelValues, true); // <-- смотри следующий кусок кода return Ext.apply({}, fieldParams, configParams); }, getValues: function(asString, dirtyOnly, includeEmptyText, useDataValues, isSubmitting) { var values = {}, fields = this.getFields().items, fLen = fields.length, isArray = Ext.isArray, field, data, val, bucket, name, f; for (f = 0; f < fLen; f++) { field = fields[f]; if (!dirtyOnly || field.isDirty()) { data = field[useDataValues ? 'getModelData' : 'getSubmitData'](includeEmptyText, isSubmitting); if (Ext.isObject(data)) { for (name in data) { if (data.hasOwnProperty(name)) { val = data[name]; if (includeEmptyText && val === '') { // <-- здесь val = field.emptyText || ''; // <-- здесь } if (!field.isRadio) { if (values.hasOwnProperty(name)) { bucket = values[name]; if (!isArray(bucket)) { bucket = values[name] = [ bucket ]; } if (isArray(val)) { values[name] = bucket.concat(val); } else { bucket.push(val); } } else { values[name] = val; } } else { values[name] = values[name] || val; } } } } } } if (asString) { values = Ext.Object.toQueryString(values); } return values; }, |
Можно создать модельку для формы. Перед созданием формы загрузить в неё пустую запись. При отправке формы вытащить запись, изменить id на нужный и сохранить запись на сервере. Тогда в форме параметр url не нужен. Нужна моделька с настроенным прокси. В прокси есть ещё параметр writer с методом transform.
Проход по минному полю выглядит тогда как-то так: Ext.define('MyFruiteStore', { extend: 'Ext.data.Store', fields: [ { name: 'id', type: 'int', allowNull: true }, { name: 'fruit', type: 'string' } ], data: [ { id: 1, fruit: 'apple' }, { id: 2, fruit: 'orange' } ], listeners: { load: function(store) { store.insert(0, [{ id: null, fruit: 'не указано' }]); } } }); Ext.define('MyFormModel', { extend: 'Ext.data.Model', fields: [ { name: 'fruit_id', type: 'int', allowNull: true } ], proxy: { type: 'ajax', url: '/form/submit.php', writer: { writeRecordId: false } } }); Ext.application({ name : 'Fiddle', launch : function() { var store = Ext.create('MyFruiteStore'); Ext.create('Ext.form.Panel', { renderTo: Ext.getBody(), width: 300, items: [ { xtype: 'combobox', anchor: '100%', store: store, editable: false, displayField: 'fruit', valueField: 'id', allowBlank: false, emptyText: 'не указано', name: 'fruit_id' } ], buttons: [ { text: 'Отправить', handler: function() { var form = this.up('form'); form.updateRecord(); var record = form.getRecord(); record.save(); } } ], listeners: { afterrender: function(form) { var record = Ext.create('MyFormModel'); form.loadRecord(record); } } }); } }); |
Или просто извлечь значения из формы, проверить, и отослать в нужном виде вручную.
|
Спасибо за ответы. Пока выкрутился таким способом:
xtype: "combobox", name: "legal_form__id", fieldLabel: "Тип ОПФ", displayField: "title", valueField: "legal_form__id", store: { type: "legalforms", listeners: { load: function(store) { store.insert(0, [{ legal_form__id: null, title: "Не выбрано", title_short: "" }]); } } } А то определять этот пунктик в хранилище по-мойму не совсем правильно. |
сегодня ткнулся в такой же комбо, как в топикстартере, и вспомнил, что я писал тут
http://javascript.ru/forum/extjs/557...omboboksa.html на всякий. |
Часовой пояс GMT +3, время: 04:46. |