我有这个控制器:
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() {
}
}
});
}
});
和这两个观点:
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() {
}
}
]
}
});
当我点击第一个按钮时,我希望加载第二个视图,反之亦然,当我点击第二个按钮时。似乎我可以在我的按钮处理程序或控制部分中添加代码 - 我希望两者都有一个例子(除非它们是相同的),并且可能解释哪种方法最好以及为什么。
请注意,我不想使用卡片布局或tabpanel - 我想知道如何从一个独立视图切换到另一个(在我的应用程序中,我有一个卡片面板和一个标签页,我需要在两个组之间切换使用按钮)
谢谢!
答案 0 :(得分:13)
您应该在控制器中使用this.control
而不是处理程序:
this.control({
'#first': {
tap: function() {
Ext.Viewport.add({
xtype: 'testsecond'
});
}
},
(您可以从视图定义中的按钮中删除handlers:
)
此外,您可能不应该首先对硬编码ID进行编码。
我处理这样的按钮的方式是:
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
});
}
},
答案 1 :(得分:7)
很好的答案但请注意,仅使用xtype调用setActiveItem()将创建新视图而不是重用已创建的视图,我最终使用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()
也可以。
答案 2 :(得分:1)
首先我们需要检查是否已经创建了xtype。以下代码将执行该操作
var xtypeToDisplay = Ext.ComponentQuery.query(btn.go)[0];
if (xtypeToDisplay == undefined)
{
xtypeToDisplay= Ext.create('Class_Name_for_that_Xtype');
}
答案 3 :(得分:1)
这对我有用:
handler: function() {
//how do I go to second view here?
Ext.Viewport.setActiveItem(Ext.create('MyApp.view.TestSecond'));
}