2

プログラムでビューをビューポートのメイン ナビゲーション ビューにプッシュしようとすると、次のエラーが発生します。

キャッチされていない TypeError: MainController.js ファイルの次の行が呼び出されると、オブジェクト [オブジェクト オブジェクト] にメソッド 'getMainPanel' がありません。

var mainnav = this.getMainPanel();

データ呼び出しから返されたデータがあるかどうかに応じて mainnav.push('viewName') を実行できるように、xtype でナビゲーション ビューへの参照を取得しようとしています。データとデータ呼び出しは正常に機能しており、必要なビューをメイン ビュー ポートに手動で追加して、ナビゲーション ビューを無価値にすることができますが、これは私の意図ではありません。

xtype、「MainPanel」、およびid、id:「MainPanel」を割り当てて、コントローラーで「Ref」を追加しようとしました:

refs: {
      mainPanel: 'MainPanel'
}

ID別:

refs: { mainPanel: '#MainPanel' }

関係なく、エラーは同じです。

参考までに、次のリソースに記載されている状況に従ってみました。

http://docs.sencha.com/touch/2.1.1/#!/guide/controllers

http://docs.sencha.com/touch/2.0.2/#!/api/Ext.ComponentQuery

http://www.sencha.com/forum/showthread.php?179143-View-reference-getter-undefined

Sencha Touch 2 - コントローラーから参照ビューを取得できません

Sencha Touch 2.0 Controller refs 属性が機能しない?

Sencha Touch 2.0 と navigation.View - MVC

これが私のコードです:

app.js

Ext.application({
name: 'AddCharSheet',
views: ['Main'],
models: ['CharacterSelectModel'],
stores: ['CharacterSelectStore'],
controllers: ['MainController'],

launch: function(){
    Ext.Viewport.add({
        xtype: 'MainPanel'
    });
}
});

Main.js

   Ext.define('AddCharSheet.view.Main', {
    extend: 'Ext.navigation.View',
    requires: ['AddCharSheet.view.CharacterSelect', 'AddCharSheet.view.AddNewCharacter', 'Ext.Toolbar', 'Ext.Panel'],
    xtype: 'MainPanel',
    config: {

    }
    });

MainController.js

Ext.define('AddCharSheet.controller.MainController',{
Extend: 'Ext.app.Controller',

config: {
    stores: ['AddCharSheet.store.CharacterSelectStore'],
    models: ['AddCharSheet.model.CharacterSelectModel'],
    views: ['AddCharSheet.view.AddNewCharacter', 'AddCharSheet.view.CharacterSelect'],

    refs: {
        mainPanel: 'MainPanel'
    },
    control: {

    },
    launch: function() {
    }
},

init: function(){
    var chs = Ext.getStore('charSelStore');
    var mainnav = this.getMainPanel();
    chs.load({
        callback: function(recs, operation){
            if(this.getCount() > 0){
                mainnav.push('CharList');
            }
            else{
                mainnav.push('NewCharacter');
            }
        }
    });
}
});

Main.js を更新し、MainController.js を更新します。

Main.js

Ext.define('AddCharSheet.view.Main', {
    extend: 'Ext.navigation.View',
    requires: ['AddCharSheet.view.CharacterSelect', 'AddCharSheet.view.AddNewCharacter', 'Ext.Toolbar', 'Ext.Panel'],
    xtype: 'MainPanel',
    config: {
        itemId: 'mainpanel'
    }
});

MainController.js

Ext.define('AddCharSheet.controller.MainController',{
    Extend: 'Ext.app.Controller',

    config: {
        stores: ['AddCharSheet.store.CharacterSelectStore'],
        models: ['AddCharSheet.model.CharacterSelectModel'],
        views: ['AddCharSheet.view.AddNewCharacter', 'AddCharSheet.view.CharacterSelect'],

        refs: {
            mainPanel: {
                autoCreate: true,
                selector: '#mainpanel',
                xtype: 'MainPanel'
            }
        },
        control: {

        },
        launch: function() {
        }
    },

    init: function(){
        var chs = Ext.getStore('charSelStore');
        var mainnav = this.getMainPanel();
        chs.load({
            callback: function(recs, operation){
                if(this.getCount() > 0){
                    mainnav.push({xtype: 'CharList'});
                }
                else{
                    mainnav.push({ xtype: 'NewCharacter'});
                }
            }
        });
    }
});
4

2 に答える 2