Не хранимое значение ExtJs

Итак, я пытаюсь создать «ненормальное» поле со списком, используя ExtJs 4, и у меня возникла небольшая проблема, которую я не могу понять, как решить. Я получил основы с кодом, который следует. На данный момент я могу получить раскрывающийся список, чтобы показать все адреса в правильном формате, и когда я нажимаю на правильный адрес, он правильно показывает значение «Street1» на входе.

Вот на чем я застрял: я пытаюсь добавить начальный элемент в поле со списком, который в основном говорит что-то вроде «Добавить новый адрес», который может выбрать пользователь. (Я планирую открыть модальное окно, в котором пользователь может ввести новый адрес, сохранить его, а затем отобразить обратно в поле со списком, но все это должно быть довольно просто) Я не могу понять способ добавления простого «Добавить новый адрес», а затем отслеживания значения, чтобы увидеть, возвращается ли это значение, чтобы узнать, появляется ли модальное окно или нет. Я не хочу добавлять его в магазин, поскольку (я предполагаю), что это добавит элемент в базу данных, и я бы предпочел, чтобы этого не произошло для «Добавить новый адрес».

Любые мысли о том, как заставить это работать? Снизу видно, что LocationStore — это мой магазин и применяются общие компоненты адреса.

Заранее спасибо.

Код со списком:

{
     xtype: 'combobox',
     anchor: '100%',
     listConfig: {
         emptyText: 'Add New Address - Empty Text',
         itemTpl: '<tpl if="Name">{Name}<br /></tpl>'+'<tpl if="Street1">{Street1}<br /></tpl>'+'<tpl if="Street2">{Street2}<br /></tpl>'+'{City}, {StateOrProvince} {PostalCode}'
     },
     emptyText: 'Add New Location - tester',
     fieldLabel: 'Street 1',
     name: 'Street1',
     allowBlank: false,
     blankText: 'Street 1 Required',
     displayField: 'Street1',
     forceSelection: true,
     store: 'LocationStore',
     typeAhead: true,
     valueField: 'Street1',
     valueNotFoundText: 'Add New Location'
 },

person Aram Papazian    schedule 05.06.2013    source источник
comment
Где вы нашли itemTpl? Я не вижу этого в документе.   -  person rixo    schedule 06.06.2013
comment
Почему бы вам не добавить эту запись «Добавить новое местоположение» в магазин?   -  person sha    schedule 06.06.2013
comment
@rixo docs.sencha .com/extjs/4.2.1/#!/api/ Если вы посмотрите на комментарии, вы увидите это там.   -  person Aram Papazian    schedule 06.06.2013
comment
@sha, потому что концептуально «Добавить новое местоположение» не является местоположением .... Я хочу, чтобы база данных была чистой от подобных вещей, тем более что вы не можете определить, где этот элемент появится, и мне нужно, чтобы он появился первым.   -  person Aram Papazian    schedule 06.06.2013
comment
Попробуйте установить emptyText вместо valueNotFoundText   -  person sha    schedule 06.06.2013
comment
@sha Я только что обновил свой код. «Добавить новое местоположение» никогда не отображается (как ни странно), «Добавить новое местоположение — тестер» отображается как заполнитель, а «Добавить новый адрес — пустой текст» правильно отображается в раскрывающемся меню, но я не могу чтобы он вообще был кликабельным.   -  person Aram Papazian    schedule 06.06.2013
comment
Я не думаю, что вы можете сделать его кликабельным. Попробуйте подписаться на событие изменения и посмотрите, запустится ли оно, когда вы выберете эту пустую строку.   -  person sha    schedule 06.06.2013
comment
@sha Это то, что я уже пробовал, но безуспешно. Похоже, что по умолчанию он в любом случае не кликабельный, поэтому событие изменения даже не запускается =/   -  person Aram Papazian    schedule 06.06.2013


Ответы (2)


Спасибо тем, кто указал мне нужное место в документе, я наконец нашел его!

Мне удалось добиться того, что вы хотите, используя tpl, к сожалению, я не смог найти способ заставить работать навигацию с помощью клавиатуры для добавленного элемента. Я просмотрел код Ext.view.BoundListKeyNav, но не не найти легкого решения...

Ключевым моментом было использование tpl вместо itemTpl и добавление разметки для дополнительного элемента перед циклом for:

listConfig: {
    tpl: '<div class="my-boundlist-item-menu">Add New Address</div>'
        + '<tpl for=".">'
        + '<div class="x-boundlist-item">' + itemTpl + '</div></tpl>'
    ,listeners: {
        el: {
            delegate: '.my-boundlist-item-menu'
            ,click: function() {
                alert('Go go go!');
            }
        }
    }
}

Остальной код находится на jsFiddle.

person rixo    schedule 06.06.2013
comment
Хороший! Я пытался заставить BoundList принудительно добавить элемент. Мне удалось добиться того, чтобы элемент был добавлен, но ни один из прослушивателей событий не работал над ним. Это идеальное решение! спасибо мельница - person Aram Papazian; 07.06.2013
comment
Большое спасибо! Была такая же проблема. - person ASP; 28.11.2013

@rixo смотрите комментарии к sencha api:

Конфигурация: Ext.form. поле.ComboBoxView


ДОБАВИТЬ ЗНАЧЕНИЕ:

Возможно, мы можем использовать функцию слияния объектов Sencha...

Чтобы поместить значение «добавить новое местоположение» вверху магазина:

var newLocation = { 'Street' : 'Add New Location' };
var dataMerged = Ext.Object.merge(newLocation,myStore.getRange());
myStore.loadData(dataMerged);

СОРТИРОВАТЬ:

  1. добавьте параметр конфигурации name в поле со списком

  2. На контроллере: (2 способа)

    'поле со списком nameComboView[name=combo]': {

    select : this.function1, // <-- when you select a item
    change : this.funciton2  // <-- when the item select are changing
    

    }

  3. Теперь в функции сравните значение с открытым модальным окном или нет.

person mfruizs2    schedule 06.06.2013
comment
Есть ли способ сделать это без загрузки данных? Я хочу использовать магазин в других местах без кнопки «Добавить новое место». Таким образом, слияние может работать, но я бы хотел добавить его в ‹ul› напрямую, не добавляя его в магазин. - person Aram Papazian; 06.06.2013
comment
Вы можете сделать: myStore.add({some: 'data'}); , но, возможно, это будут не первые данные. - person mfruizs2; 06.06.2013
comment
Я думаю, вы упускаете из виду, что я не хочу добавлять данные в хранилище. Если я добавлю данные в хранилище, этот фрагмент данных будет добавлен ко всем остальным компонентам приложения. Мне нужно добавить его в поле со списком, не добавляя его в магазин... Вот что делает это намного сложнее = p - person Aram Papazian; 06.06.2013