15.06.2015, 00:37
|
|
Соединяю Node.js и Ext JS
|
|
Регистрация: 25.06.2009
Сообщений: 1,033
|
|
combobox и значение null (аля вариант "не выбрано")
Как мне сделать, чтобы в combobox-е можно было выбрать значение null?
То есть чтобы display значение было к примеру Не выбрано, а value значение было именно null, чтобы потом в базу данных NULL попал, а не что-то иное.
Такие варианты не подходят http://stackoverflow.com/questions/9...extjs-combobox
|
|
15.06.2015, 10:07
|
Аспирант
|
|
Регистрация: 27.03.2015
Сообщений: 31
|
|
пример не буду писать (на работу вышел после отпуска), но в общих чертах: на листенер load стора, можно дописать в стор нулевую запись, в которой будет только "видимое значение".
|
|
15.06.2015, 12:30
|
|
Соединяю Node.js и Ext JS
|
|
Регистрация: 25.06.2009
Сообщений: 1,033
|
|
это вы предлагает чтобы id у этой записи был равен null???
|
|
15.06.2015, 17:14
|
Профессор
|
|
Регистрация: 19.11.2012
Сообщений: 178
|
|
Задача нередко встречается...
Если в форме указан параметр 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;
},
|
|
15.06.2015, 17:21
|
Профессор
|
|
Регистрация: 19.11.2012
Сообщений: 178
|
|
Можно создать модельку для формы. Перед созданием формы загрузить в неё пустую запись. При отправке формы вытащить запись, изменить 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);
}
}
});
}
});
Последний раз редактировалось novikov, 15.06.2015 в 18:56.
|
|
15.06.2015, 17:39
|
Профессор
|
|
Регистрация: 19.11.2012
Сообщений: 178
|
|
Или просто извлечь значения из формы, проверить, и отослать в нужном виде вручную.
|
|
15.06.2015, 21:43
|
|
Соединяю Node.js и Ext JS
|
|
Регистрация: 25.06.2009
Сообщений: 1,033
|
|
Спасибо за ответы. Пока выкрутился таким способом:
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: ""
}]);
}
}
}
А то определять этот пунктик в хранилище по-мойму не совсем правильно.
|
|
24.06.2015, 10:14
|
Аспирант
|
|
Регистрация: 27.03.2015
Сообщений: 31
|
|
сегодня ткнулся в такой же комбо, как в топикстартере, и вспомнил, что я писал тут
очистить значение комбобокса
на всякий.
|
|
|
|