Sencha Touch 2 MVC - как переключать виды с помощью кнопки
У меня есть этот контроллер:
Ext.define('MyApp.controller.Test', {
extend: 'Ext.app.Controller',
config: {
},
refs: [
{
ref: 'first',
selector: '#first'
},
{
ref: 'second',
selector: '#second'
}
],
views : [
'TestMain',
'TestSecond'
],
init: function() {
this.getTestMainView().create();
this.control({
'#first': {
tap: function() {
//how do I go to second view here?
}
},
'#second': {
tap: function() {
}
}
});
}
});
и эти 2 вида:
Ext.define('MyApp.view.TestMain', {
extend: 'Ext.Container',
xtype: 'testmain',
config: {
fullscreen: true,
layout: 'vbox',
scrollable: true,
items: [
{
xtype: 'button',
ui: 'normal',
id: 'first',
text: 'Go To Second Screen',
handler: function() {
//how do I go to second view here?
}
}
]
}
});
...
Ext.define('MyApp.view.TestSecond', {
extend: 'Ext.Container',
xtype: 'testsecond',
config: {
fullscreen: true,
layout: 'vbox',
scrollable: true,
items: [
{
xtype: 'button',
ui: 'normal',
id: 'second',
text: 'Go To First Screen',
handler: function() {
}
}
]
}
});
Я бы хотел, чтобы второе представление загружалось, когда я нажимаю на первую кнопку, и наоборот, когда я нажимаю на вторую кнопку. Кажется, я могу добавить код либо в обработчик кнопок, либо в секцию управления - я был бы признателен за пример обоих (если они не совпадают) и, возможно, объяснение того, какой метод лучше всего и почему.
Обратите внимание: я НЕ хочу использовать макет карты или вкладку - я хочу знать, как переключиться с одного автономного представления на другое (в моем приложении у меня есть панель карты и вкладка, и мне нужно переключаться между обеими группами используя кнопки)
Спасибо!!
Ответы
Ответ 1
Вместо обработчиков вы должны использовать this.control
в контроллере:
this.control({
'#first': {
tap: function() {
Ext.Viewport.add({
xtype: 'testsecond'
});
}
},
(вы можете отбросить handlers:
от кнопки в определении представления)
Кроме того, вы, вероятно, не должны иметь идентификаторы жесткого кода в первую очередь.
Как я обрабатываю такие кнопки:
items: [
{
xtype: 'button',
ui: 'normal',
text: 'Go To First Screen',
go: 'testsecond'
},
...
Затем в базовом контроллере, который применяется ко всем представлениям, я делаю что-то вроде:
this.control({
'button[go]': {
tap: function(btn) {
Ext.Viewport.setActiveItem({
xtype: btn.go
});
}
},
Ответ 2
Отличный ответ, но будьте осторожны, что вызов setActiveItem() с помощью только xtype создаст новые представления вместо повторного использования тех, которые уже созданы, я закончил использование Ext.ComponentQuery
, чтобы сначала получить цель, а затем setActiveItem, здесь код:
this.control({
'button[go]': {
tap: function(btn) {
viewport = Ext.ComponentQuery.query('my-custom-viewport-xtype');
target = Ext.ComponentQuery.query(btn.go);
viewport[0].setActiveItem(target[0]);
}
}
});
Также обратите внимание, что я использую пользовательский видовой экран для добавления эффектов слайдов и т.д., но вызов непосредственно Ext.Viewport.setActiveItem()
, как и предыдущий пример, будет работать.
Ответ 3
Сначала нам нужно проверить, был ли этот xtype уже создан или нет. Следующий код сделает это
var xtypeToDisplay = Ext.ComponentQuery.query(btn.go)[0];
if (xtypeToDisplay == undefined)
{
xtypeToDisplay= Ext.create('Class_Name_for_that_Xtype');
}
Ответ 4
Это сработало для меня:
handler: function() {
//how do I go to second view here?
Ext.Viewport.setActiveItem(Ext.create('MyApp.view.TestSecond'));
}