1

ばかげた問題がありますので、手を貸していただきたいと思います。よろしくお願いします。

状況は次のとおりです。2つのwiew(どちらもsenchaarchitect 2.0で作成)があり、1つはログイン用、もう1つは汎用用です。そして、ログインしようとしたときの成功した応答に関する2番目のビューをロードしたいと思います。これは、ログインが成功した後です。主な問題は、Ex.create、Ext.Viewport.add、Ext.Viewport.setActiveItemを試してみましたが、2番目のビューを画面に表示することができず、ログイン画面がそのまま残り、アプリは他のビューをロードしません。もう1つ、これにはナビゲーションビューを使用する必要はありません。

これが私のコントローラーのコードで、そこから2番目のビューをロードします。ご覧のとおり、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

ログインパネルを破棄します。もう必要ありません...

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 に答える
0

ここにはいくつかの問題があります。

  • autoCreate ルールは xtype: 'tabpanel' を使用します。これは、アイテムを含まないバニラの Ext.TabPanel のみを作成します。xtype: 'mainTabPanel' のように xtype 属性を MyApp.view.MainTabPanel に割り当て、その xtype 値を autoCreate ルールで使用する必要があります。

  • 次に、 this.getMainTabPanel() が間違ったオブジェクトを返すため、このコードが機能しない理由を説明します。Ext.Viewport.setActiveItem(paneltab) を使用する方が簡単です。

    • 通常、ビューに id を割り当てたくありません (id: 'mainTabPanel')。xtype を使用してフェッチする方が安全です。この場合は必要ありませんが、グローバル ID を避けることで、ビュー (または他のクラス タイプ) の複数のインスタンスを作成できます。
于 2013-11-23T00:22:15.087 に答える