2

ヘルプ!多数のさまざまなビューを含む ExtJS 4.2 MVC アプリケーションがあります。ただし、各ユーザーがアクセスできるのは、セット全体のごく一部です。明らかに、すべてのユーザーのすべてのビューをロードしたくありません! さらに、「許可された」各ビューは、ユーザーがサインインした後にロードする必要があります。

以前 (MVC 以前)、Ext.create() を使用して .js クラス ファイルを動的にロードしていました。しかし、私は MVC 設計パターンを使用しようとしていますが、オンラインで読んだことはすべて、これが ExtJS 4.2 MVC の制限であるように思われることを示唆しています。これは本当ですか?以下は、私がこれまでに試したことです。

まず、カスタム ビューの定義 (基本的なコンテナーの例):

Ext.define('My.custom.TestView', {
    extend: 'Ext.container.Container',
    alias: 'widget.myCustomTestView',
    html: 'Test',

    initComponent: function() {
        this.callParent(arguments);
    }
});

次に、カスタム ビューをロード/インスタンス化しようとしているコントローラーの定義:

Ext.define('My.custom.TestController', {
    extend: 'Ext.app.Controller',

    // Empty array because I want to
    // add views during run-time.
    views: [
    ],

    init: function () {
        // Attempt #1: This produces an error.
        this.getView('My.custom.TestView').create();

        // Attempt #2: This returns null.
        Ext.widget('myCustomTestView');

        // Attempt #3: This appears it might work, but it's ugly!
        Ext.create('My.custom.TestView');
        this.getView('My.custom.TestView').create();
    }
});

#3はエラーを出さない唯一のものですが、私には正しく見えません。提案/コメントはありますか?

4

1 に答える 1

1

Ext.create() は同期ロードを引き起こすため、ビューの依存 js ファイルがロードされているかどうかを実際に確認し、ロードされていない場合は js ファイルの同期ロードを行い、の実行を停止します。 js がロードされ、Ext.Loader によって初期化されるまで、コードを実行します。ビュー クラスが Ext 内で使用できるようになったため、クラスで getView().create() を実行できます。

他の 2 つの場合:

  1. My.custom.TestView が既にロードされていることを前提としているため、エラーが発生しますが、ロードされていないため、インスタンスを作成するためにロードしたクラスの定義を見つけることができません。

  2. おそらく、Ext.widget の実装方法が原因で、まだロードされていないクラスのウィジェット名を指定する Ext.widget() の呼び出しがアプリを壊さないようにするために、null を返します。

1 と 2 はどちらも Ext.create() とは異なり、Ext.Loader を呼び出してクラス ファイルを解決し、内部的に Ext に既にロードされていないことが判明した場合にクラス ファイルをロードしませんそれらは、すでにロードされていて、呼び出された時点でアプリケーションで使用可能なコードに基づいて動作するだけです。

ここの Exts ドキュメントで Ext.Loader を少し読む価値がありますhttp://docs.sencha.com/extjs/4.2.1/#!/api/Ext.Loader

于 2013-05-24T19:26:19.773 に答える