1

我有一个愚蠢的问题,我希望你帮我一把。在此先感谢。

情况如下:我有 2 个视图(均使用 sencha architect 2.0 创建),一个用于登录,另一个用于一般用途。我想在尝试登录时加载成功响应的第二个视图,这是在任何成功登录之后。主要问题是我尝试过使用 Ex.create、Ext.Viewport.add、Ext.Viewport.setActiveItem,但我无法让第二个视图出现在屏幕上,登录屏幕只是保持在那里并且应用程序不会加载其他视图。另一件事,我不必为此使用导航视图。

这是我的控制器的代码,我想从中加载我的第二个视图。正如您将看到的,我什至创建了视图的引用,它启用了 autoCreate 并且 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!');
        }
    });
}
});

这是我的登录视图的代码:

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

最后,我要加载的视图代码。如果我将其设置为初始视图,此视图会正常加载,但在成功登录时不会加载:

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

拜托,我需要帮助... :) 我被困在这里 3 天了,无法弄清楚问题出在哪里。谢谢你。

4

3 回答 3

2

你也可以发布你的 app.js 吗?我在这里尝试您的代码,它按预期加载视图。这是我的 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();
                }
            }
        );
    }
});
于 2012-09-10T04:53:31.050 回答
0

这里有几个问题:

  • 您的 autoCreate 规则使用 xtype: 'tabpanel' ,它只会创建一个没有项目的普通 Ext.TabPanel。您需要为您的 MyApp.view.MainTabPanel 分配一个 xtype 属性,例如 xtype: 'mainTabPanel' ,然后在您的 autoCreate 规则中使用该 xtype 值。

  • 这就解释了为什么这段代码不起作用,因为 this.getMainTabPanel() 将返回错误的对象。更简单的是只使用 Ext.Viewport.setActiveItem(paneltab)。

    • 通常,您通常不希望为视图分配 id (id: 'mainTabPanel')。只使用 xtype 来获取它更安全。尽管在这种情况下您不需要它,但避免全局 id 允许您创建视图(或任何其他类类型)的多个实例。
于 2013-11-23T00:22:15.087 回答
0

销毁登录面板,您不再需要它了...

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);
        }
    },
于 2012-06-08T08:22:22.390 回答