0

MVC アーキテクチャでアプリを開発しようとしています。私は次のコントローラコードを持っています:

Ext.define('PM.controller.Projects', {
    extend: 'Ext.app.Controller',

    models: ['Project'],
    stores: ['Projects'],

    views: [
        'projects.Tree',
        'Toolbar',
    ],

    init: function(config) {
        var tree = this.getProjectsTreeView();
        var rootNode = tree.getRootNode();
        console.log(rootNode);
        this.callParent(config);
    }
});

そして、このビューコード:

Ext.define('PM.view.projects.Tree', {
    extend: 'Ext.tree.Panel',
    xtype: 'projectsTree',

    title: 'Projects',
    hideHeaders: true,
    root: {
        text: "Projekte"
    }

});

コントローラーのツリー ビューからルート ノードを取得しようとしますが、コントローラーで getRootNode() が有効な関数ではないというエラーが表示されます。このエラーが発生する理由を誰か教えてもらえますか? 私の目標は、ajax リクエストからこのルート ノードに新しい子を追加することです。

ありがとう

4

1 に答える 1

0

ビュー配列内の各文字列に対して Ext が生成するメソッドは、それぞれのビューを作成するために使用できるコンストラクタを返します。奇妙に思えますが、その通りです。

実際のビュー コンポーネントにアクセスする場合は、そのための を作成する必要がありますrefinitメソッドは、ビューがまだ存在することを前提とすべきではありません。おそらくすべてのビューがページに追加される場所であるinitアプリケーションのメソッドの前にコントローラーのメソッドが呼び出されるため、そうではない可能性が非常に高いです。launch

アプリケーションが起動され、ビューが追加された後に呼び出されるコントローラーのonLaunchテンプレート メソッドにロジックを配置します。

Ext.define('PM.controller.Projects', {
    extend: 'Ext.app.Controller',

    refs: [{
        ref: 'projectsTreeView',
        selector: 'projectsTree'
    }],

    init: function() {
        // It's safe to add selectors for views that don't exist yet.
        this.control(/*...*/)
    },

    onLaunch: function(config) {
        var tree = this.getProjectsTreeView();
        var rootNode = tree.getRootNode();
        console.log(rootNode);
    }
});

これが機能しない場合は、実際にビューをどこにも追加していないことを意味します。追加できる場所の 1 つは、アプリケーションの起動メソッドです。ツリービューを追加する必要があります。

Ext.application({
    // ...

    views: ['projects.Tree']

    launch: function() {
        Ext.create('Ext.container.Viewport', {
            layout: 'fit',
            items: [new this.getProjectsTreeView()]
        });
    }
});

したがって、イベントの年表は次のとおりです。

Application#constructor 
Controller#constructor
Controller#init (can't assume the view exists)
Application#onBeforeLaunch
Application#launch (view is now added)
Controller#onLaunch (do something with the view that is now available)

また、ビュー エイリアスは'widget.projectsTree'だけではない必要がある場合があります'projectsTree'

于 2013-03-04T02:35:18.247 に答える