Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 15.06.2015, 00:37
Аватар для khusamov
Соединяю Node.js и Ext JS
Отправить личное сообщение для khusamov Посмотреть профиль Найти все сообщения от khusamov
 
Регистрация: 25.06.2009
Сообщений: 1,033

combobox и значение null (аля вариант "не выбрано")
Как мне сделать, чтобы в combobox-е можно было выбрать значение null?

То есть чтобы display значение было к примеру Не выбрано, а value значение было именно null, чтобы потом в базу данных NULL попал, а не что-то иное.

Такие варианты не подходят http://stackoverflow.com/questions/9...extjs-combobox
Ответить с цитированием
  #2 (permalink)  
Старый 15.06.2015, 10:07
Аспирант
Отправить личное сообщение для bastrakov Посмотреть профиль Найти все сообщения от bastrakov
 
Регистрация: 27.03.2015
Сообщений: 31

пример не буду писать (на работу вышел после отпуска), но в общих чертах: на листенер load стора, можно дописать в стор нулевую запись, в которой будет только "видимое значение".
Ответить с цитированием
  #3 (permalink)  
Старый 15.06.2015, 12:30
Аватар для khusamov
Соединяю Node.js и Ext JS
Отправить личное сообщение для khusamov Посмотреть профиль Найти все сообщения от khusamov
 
Регистрация: 25.06.2009
Сообщений: 1,033

это вы предлагает чтобы id у этой записи был равен null???
Ответить с цитированием
  #4 (permalink)  
Старый 15.06.2015, 17:14
Профессор
Отправить личное сообщение для novikov Посмотреть профиль Найти все сообщения от novikov
 
Регистрация: 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;
    },
Ответить с цитированием
  #5 (permalink)  
Старый 15.06.2015, 17:21
Профессор
Отправить личное сообщение для novikov Посмотреть профиль Найти все сообщения от novikov
 
Регистрация: 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.
Ответить с цитированием
  #6 (permalink)  
Старый 15.06.2015, 17:39
Профессор
Отправить личное сообщение для novikov Посмотреть профиль Найти все сообщения от novikov
 
Регистрация: 19.11.2012
Сообщений: 178

Или просто извлечь значения из формы, проверить, и отослать в нужном виде вручную.
Ответить с цитированием
  #7 (permalink)  
Старый 15.06.2015, 21:43
Аватар для khusamov
Соединяю Node.js и Ext JS
Отправить личное сообщение для khusamov Посмотреть профиль Найти все сообщения от khusamov
 
Регистрация: 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: ""
			}]);
		}
	}
}


А то определять этот пунктик в хранилище по-мойму не совсем правильно.
Ответить с цитированием
  #8 (permalink)  
Старый 24.06.2015, 10:14
Аспирант
Отправить личное сообщение для bastrakov Посмотреть профиль Найти все сообщения от bastrakov
 
Регистрация: 27.03.2015
Сообщений: 31

сегодня ткнулся в такой же комбо, как в топикстартере, и вспомнил, что я писал тут
очистить значение комбобокса
на всякий.
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Парсинг рамблер кассы Sub-zerro Общие вопросы Javascript 10 19.02.2018 23:13
Выводить значение раньше переменных Гробовщик Общие вопросы Javascript 11 10.09.2013 08:42
Растянуть элемент по содержимому AnToxa Элементы интерфейса 11 09.04.2012 22:13
IE 8 Не удалось получить значение свойства "match": значением объекта является null abstract Internet Explorer 2 26.08.2011 15:27
ComboBox в POST не выводит значение astral_sight ExtJS 2 23.08.2010 14:17