Javascript-форум (https://javascript.ru/forum/)
-   ExtJS (https://javascript.ru/forum/extjs/)
-   -   combobox и значение null (аля вариант "не выбрано") (https://javascript.ru/forum/extjs/56411-combobox-i-znachenie-null-alya-variant-ne-vybrano.html)

khusamov 15.06.2015 00:37

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

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

Такие варианты не подходят http://stackoverflow.com/questions/9...extjs-combobox

bastrakov 15.06.2015 10:07

пример не буду писать (на работу вышел после отпуска), но в общих чертах: на листенер load стора, можно дописать в стор нулевую запись, в которой будет только "видимое значение".

khusamov 15.06.2015 12:30

это вы предлагает чтобы id у этой записи был равен null???

novikov 15.06.2015 17:14

Задача нередко встречается...

Если в форме указан параметр 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;
    },

novikov 15.06.2015 17:21

Можно создать модельку для формы. Перед созданием формы загрузить в неё пустую запись. При отправке формы вытащить запись, изменить 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 17:39

Или просто извлечь значения из формы, проверить, и отослать в нужном виде вручную.

khusamov 15.06.2015 21:43

Спасибо за ответы. Пока выкрутился таким способом:

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: ""
			}]);
		}
	}
}


А то определять этот пунктик в хранилище по-мойму не совсем правильно.

bastrakov 24.06.2015 10:14

сегодня ткнулся в такой же комбо, как в топикстартере, и вспомнил, что я писал тут
http://javascript.ru/forum/extjs/557...omboboksa.html
на всякий.


Часовой пояс GMT +3, время: 04:46.