Навигация с помощью кнопки в сенча тач

Делаю первые шаги с Sencha touch. Результаты - это именно то, что мне нужно, однако добиться этого - это борьба, чтобы понять, как собирается сенча. Я медленно разбираюсь в этом, но иногда код работает немного WTF.

Я пытаюсь создать очень простое приложение, которое делает следующее.

1) Имеет три вкладки: Поиск поблизости (гео), Быстрый поиск по ключевым словам, Поиск по категориям.
2) Поиск по каждой из вкладок возвращает список результатов
3) Каждая из строк может быть отображена по клику Дополнительная информация.

Я разобрался с вкладками, думаю, все в порядке.

Вот так:

Ext.setup({
    tabletStartupScreen: 'tablet_startup.png',
    phoneStartupScreen: 'phone_startup.png',
    icon: 'icon.png',
    glossOnIcon: false,
    onReady: function() {

                var location = new Ext.Container({
            iconCls: 'search', 
            title: 'Location Search',
            items: [new Ext.Component({
                html: '<img src="images/gfb.gif" />'
            })]
        });

        var quick = new Ext.Container({
            iconCls: 'search', 
            title: 'Quick Search',
            scroll: 'vertical',
            items: [new Ext.Component({
                html: '<img src="images/gfb.gif" />'
            })]
        });

        var category = new Ext.Component({
            iconCls: 'search', 
            title: 'Category Search',
            html: '<img src="images/gfb.gif" /><p>Category</p>'
        });
        var tabpanel = new Ext.TabPanel({
            fullscreen: true,
            tabBar: {
                dock: 'bottom',
                scroll: 'horizontal',
                sortable: false,
                layout: {
                    pack: 'center'
                }
            },
            cls: 'card1',
            items: [
                location,
                quick,
                category
            ]
        });
    }
});

Это прекрасно работает. Нет разницы между вкладками, которые я знаю, но я настраиваюсь на это...

Да, первое, над чем я хочу поработать, — это вкладка поиска по ключевым словам, так как ее проще всего протестировать для этого приложения.

Итак, я добавляю форму.

var quickFormBase = {
                url: "../quicksearch.php?output=json",
                items: [{
                   xtype: 'fieldset',
                   instructions: 'The keyword search is great if you know the name of the company you are looking for, or the particular service you need to find.<p><br />To narrow it down to an area include the town or county name in your query</p>',
                   defaults: {
                       required: false,
                       labelAlign: 'left'
                   },
                   items: [{
                           xtype: 'textfield',
                           label: 'Search',
                           name : 'inpquery',
                           showClear: true,
                           autoCapitalize : false
                       }]
            }],
            listeners : {
                submit : function(form, result){
            console.log('results', result.SearchResults.MainResults.Advert);
                },
                exception : function(form, result){
                    console.log('failure', Ext.toArray(arguments));
                }
            }
    };

var quickForm = new Ext.form.FormPanel(quickFormBase);

Итак, моя конфигурация быстрой вкладки теперь выглядит так:

var quick = new Ext.Container({
            iconCls: 'search', 
            title: 'Quick Search',
            scroll: 'vertical',
            items: [new Ext.Component({
                html: '<img src="images/gfb.gif" />'
            }),quickForm]
});

Теперь у меня есть форма, которая выглядит именно так, как я хочу, и подключена к моему поиску json и возвращает рекламу на консоль. Здорово!

Теперь я хочу создать представление списка с верхней панелью и кнопкой «Назад». Я почти уверен, что это не способ настроить это, но я действительно изо всех сил пытаюсь найти примеры того, как это сделать, поскольку пример с источником имеет сложную настройку, а простые не делают то, что мне нужно. .

Теперь я добавляю конфигурацию модели вверху моего файла index.js, чтобы определить мою рекламную модель.

Ext.regModel('Advert',{
    fields: [
             {name: 'advertid', type:'int'},
             {name: 'Clientname', type:'string'},
             {name: 'telephone', type:'string'},
             {name: 'mobile', type:'string'},
             {name: 'fax', type:'string'},
             {name: 'url', type:'string'},
             {name: 'email', type:'string'},
             {name: 'additionalinfo', type:'string'},
             {name: 'address1', type:'string'},
             {name: 'address2', type:'string'},
             {name: 'address3', type:'string'},
             {name: 'postcode', type:'string'},
             {name: 'city', type:'string'},
             {name: 'Countyname', type:'string'},
             {name: 'longitude', type:'string'},
             {name: 'latitude', type:'string'}
    ]
});

В моем слушателе успеха формы я делаю следующее:

listeners : {
                submit : function(form, result){

                    var quickstore = new Ext.data.JsonStore({
                        model  : 'Advert',
                        data : result.SearchResults.MainResults.Advert
                    });

                    var listConfig = {
                            tpl: '<tpl for="."><div class="advert">{Clientname}</div></tpl>',
                            scope: this,
                            itemSelector: 'div.advert',
                            singleSelect: true,
                            store: quickstore,
                            dockedItems: [
                                            {
                                                xtype: 'toolbar',
                                                dock: 'top',
                                                items: [
                                                    {
                                                        text: 'Back',
                                                        ui: 'back',
                                                        handler: function(){
                                                            //Do some magic and make it go back, ta!
                                                        }
                                                    }
                                                ]
                                            }
                                        ]
                    };
                    var list = new Ext.List(Ext.apply(listConfig, {
                        fullscreen: true
                    }));
                },
                exception : function(form, result){
                    console.log('failure', Ext.toArray(arguments));
                }
        }

Это работает, однако не скользит, как хотелось бы, как при нажатии значков на нижней панели вкладок.

Теперь я падаю вниз, я не могу понять, как заставить работать кнопку «Назад», чтобы вернуться к поиску по ключевым словам.

Я нашел setCard и setActiveItem, но, похоже, я не могу получить доступ к ним в контексте «этот» в функции прослушивания результатов.

Может ли кто-нибудь привести простой пример того, как это сделать?


person johnwards    schedule 21.10.2010    source источник
comment
++++1! Многие согласны с вашим положением и успехом с Sencha Touch. Отличное объяснение.   -  person Old McStopher    schedule 09.07.2011


Ответы (1)


Самый простой способ решить эту проблему, вероятно, дать вашей TabPanel идентификатор, а затем сослаться на него внутри вашего обработчика. Попробуйте обновить панель вкладок следующим образом:

var tabpanel = new Ext.TabPanel({
    id: 'mainPanel',
    ... the rest of your config here

И ваш обработчик кнопки «Назад» выглядит так:

handler: function() {
    Ext.getCmp('mainPanel').layout.setActiveItem(0);
}

Это переместится на первую карту на вкладке (ваша карта местоположения).

В качестве альтернативы, если вы хотите изменить значение this в функции обработчика, вы можете просто передать область действия:

text: 'Back',
ui: 'back',
scope: tabpanel,
handler: function(){
    this.layout.setActiveItem(0);
}

'this' теперь относится ко всему, что вы передали в конфигурации области видимости. Очень часто люди используют «scope: this», так что «this» внутри их обработчика совпадает с «this» вне обработчика.

person Ed Spencer    schedule 26.10.2010