Sencha Touch 2 MVC - 如何使用按钮切换视图

时间:2011-10-24 23:23:45

标签: sencha-touch sencha-touch-2

我有这个控制器:

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 - 我想知道如何从一个独立视图切换到另一个(在我的应用程序中,我有一个卡片面板和一个标签页,我需要在两个组之间切换使用按钮)

谢谢!

4 个答案:

答案 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')); 
}