Load another view after login with sencha touch 2.0

痴心易碎 提交于 2020-01-01 19:54:04

问题


I'm having a dumb problem and I would like you to give me a hand.Thanks in advance.

The situatios is as follows: I have 2 wiews (both created with sencha architect 2.0), one for login, and another for general purposes. And I would like to load the second view on successful response when trying to log in, this is, after any successful login. The main problem is that I've tried with Ex.create, Ext.Viewport.add, Ext.Viewport.setActiveItem, but I can't manage to make the second view to appear on screen, the login screen just keeps there and the app does not load the other view. Another thing, I don't have to use a navigation view for this.

Here is the code of my controller, from which I want to load my second view. And as you'll see, I even created a reference of the view, which has autoCreate enabled and has that ID "mainTabPanel":

Ext.define('MyApp.controller.Login', {
extend: 'Ext.app.Controller',
config: {
    refs: {
        loginButton: {
            selector: '#login',
            xtype: 'button'
        },
        username: {
            selector: '#user',
            xtype: 'textfield'
        },
        password: {
            selector: '#pass',
            xtype: 'passwordfield'
        },
        mainTabPanel: {
            selector: '#mainTabPanel',
            xtype: 'tabpanel',
            autoCreate: true
        }
    },

    control: {
        "loginButton": {
            tap: 'onLoginButtonTap'
        }
    }
},

onLoginButtonTap: function(button, e, options) {
    Ext.Ajax.request({
        url: '../../backend/auth.php',

        method: 'POST',

        params: {
            user: this.getUsername().getValue(),
            pass: this.getPassword().getValue()
        },

        success: function(response) {
            var json = Ext.decode(response.responseText);
            if (json.type == 'success') {
                // LOAD THE DAMN SECOND VIEW HERE!
                //var paneltab = Ext.create('MyApp.view.MainTabPanel');
                //Ext.Viewport.add(paneltab);
                //Ext.Viewport.setActiveItem(this.getMainTabPanel());
            } else {
                alert(json.value);
            }
        },

        failure: function(response) {
            alert('The request failed!');
        }
    });
}
});

And here is the code of my login view:

Ext.define('MyApp.view.LoginForm', {
extend: 'Ext.form.Panel',

config: {
    id: 'loginForm',
    ui: 'light',
    items: [
        {
            xtype: 'fieldset',
            ui: 'light',
            title: 'Log into the system',
            items: [
                {
                    xtype: 'textfield',
                    id: 'user',
                    label: 'User',
                    name: 'user'
                },
                {
                    xtype: 'passwordfield',
                    id: 'pass',
                    label: 'Pass',
                    name: 'pass'
                }
            ]
        },
        {
            xtype: 'button',
            id: 'login',
            ui: 'confirm',
            text: 'Login'
        }
    ]
}
});

And finally, the code of the view I want to load. This view loads normally if I set it as the Initial View, but does not load when a successful login occurs:

Ext.define('MyApp.view.MainTabPanel', {
extend: 'Ext.tab.Panel',

config: {
    id: 'mainTabPanel',
    layout: {
        animation: 'slide',
        type: 'card'
    },
    items: [
        {
            xtype: 'container',
            layout: {
                type: 'vbox'
            },
            title: 'Tab 1',
            iconCls: 'time',
            items: [
                {
                    xtype: 'titlebar',
                    docked: 'top',
                    title: 'General Report',
                    items: [
                        {
                            xtype: 'button',
                            iconCls: 'refresh',
                            iconMask: true,
                            text: '',
                            align: 'right'
                        }
                    ]
                },
                {
                    xtype: 'container',
                    height: 138,
                    flex: 1,
                    items: [
                        {
                            xtype: 'datepickerfield',
                            label: 'From',
                            placeHolder: 'mm/dd/yyyy'
                        },
                        {
                            xtype: 'datepickerfield',
                            label: 'To',
                            placeHolder: 'mm/dd/yyyy'
                        },
                        {
                            xtype: 'numberfield',
                            label: 'Hours'
                        }
                    ]
                },
                {
                    xtype: 'dataview',
                    ui: 'dark',
                    itemTpl: [
                        '<div style="height:50px; background-color: white; margin-bottom: 1px;">',
                        '    <span style="color: #0000FF">{user}</span>',
                        '    <span>{description}</span>',
                        '</div>'
                    ],
                    store: 'hoursStore',
                    flex: 1
                }
            ]
        },
        {
            xtype: 'container',
            title: 'Tab 2',
            iconCls: 'maps'
        },
        {
            xtype: 'container',
            title: 'Tab 3',
            iconCls: 'favorites'
        }
    ],
    tabBar: {
        docked: 'bottom'
    }
}
});

Please, I need help... :) I'm stuck here for like 3 days now and can't figure out what the problem is. Thank you.


回答1:


Could you post your app.js too? I'm trying your code here and it load the view as expected. Here is my app.js:

Ext.application({
    name: 'MyApp',

    requires: [
        'Ext.MessageBox'
    ],
    controllers: ['Login'],
    views: ['LoginForm','MainTabPanel'],

    icon: {
        '57': 'resources/icons/Icon.png',
        '72': 'resources/icons/Icon~ipad.png',
        '114': 'resources/icons/Icon@2x.png',
        '144': 'resources/icons/Icon~ipad@2x.png'
    },

    isIconPrecomposed: true,

    startupImage: {
        '320x460': 'resources/startup/320x460.jpg',
        '640x920': 'resources/startup/640x920.png',
        '768x1004': 'resources/startup/768x1004.png',
        '748x1024': 'resources/startup/748x1024.png',
        '1536x2008': 'resources/startup/1536x2008.png',
        '1496x2048': 'resources/startup/1496x2048.png'
    },

    launch: function() {
        // Destroy the #appLoadingIndicator element
        Ext.fly('appLoadingIndicator').destroy();

        // Initialize the main view
        //Ext.Viewport.add(Ext.create('MyApp.view.Main'));
        Ext.Viewport.add(Ext.create('MyApp.view.LoginForm'));
    },

    onUpdated: function() {
        Ext.Msg.confirm(
            "Application Update",
            "This application has just successfully been updated to the latest version. Reload now?",
            function(buttonId) {
                if (buttonId === 'yes') {
                    window.location.reload();
                }
            }
        );
    }
});



回答2:


Destroy the login panel, You don't really need it anymore...

success: function(response) {
        var json = Ext.decode(response.responseText);

        if (json.type == 'success') {
            // LOAD THE DAMN SECOND VIEW HERE!
            var paneltab = Ext.create('MyApp.view.MainTabPanel');
            Ext.getCmp('loginForm').destroy();
            Ext.Viewport.add(paneltab);

        } else {
            alert(json.value);
        }
    },



回答3:


There are several problems here:

  • Your autoCreate rule uses an xtype: 'tabpanel' which will only ever create a vanilla Ext.TabPanel with no items in it. You'd need to assign an xtype attribute to your MyApp.view.MainTabPanel like xtype: 'mainTabPanel' and then use that xtype value in your autoCreate rule.

  • This then explains why this code won't work since this.getMainTabPanel() will return the wrong object. Simpler would be to just use Ext.Viewport.setActiveItem(paneltab).

    • In general, you usually don't want assign an id to a view (id: 'mainTabPanel'). Safer to just use an xtype to fetch it. Although you don't need it in this case, avoiding global id's allows you to create multiple instances of a view (or any other class type).


来源:https://stackoverflow.com/questions/10944351/load-another-view-after-login-with-sencha-touch-2-0

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!