9

Ext JS 4を使用してアプリケーションを作成しました。controllersプロパティにはapp.js、メインコントローラーのみが含まれています。

Ext.application({
    name: 'MyApp',
    appFolder: 'app',

    controllers: [
        "main.App"
    ],

    loadController: function(controller) {
        var oController = this.getController(controller);
        oController.init(this);
        oController.onLaunch(this);
    }
});

MyApp.main.Appコントローラは、 getController()アプローチを使用して名前で追加のコントローラをロードします(loadController()メソッドを参照)。これらのコントローラーは動的にロードされ、index.htmlファイルにリストされていません。

サーバーにデプロイするための製品版を生成するために、アプリケーションフォルダーで次のコマンドを発行してSenchaCmdを使用しています。

sencha app build

ツールは正常に終了し、すべてのファイルを1つの大きなall-classes.jsに圧縮します。問題は、動的にロードされたコントローラーがそのファイルに含まれていないことです。

動的にロードされたコントローラー(合計100以上)をSencha Cmdによって縮小および処理するための正しい方法はどれですか?

私はそれらを自分のにリストしapp.jsたり、を使用していくつかのファイルに含めることができることを知っていますExt.requireが、100を超える異なるコントローラー、ビュー、モデル、およびストアをビルドに自動的に含めるための正しいアプローチを探しています。大規模なアプリケーションを作成していて、なんとかして構築しているExt JSの他のユーザーだと思いますsuccess stories。正しい構築方法を見つけるのに役立つ提案や、ただの提案に感謝します。

4

1 に答える 1

7

すべてのコントローラーをusesアレイに配置します。これらは、ツールにそれらを追跡させ、ビルドに含めるように強制する必要があります。一方、usesは、定義時にクラスが使用可能である必要はありませんが、onReady(1つはアプリケーション内にあります)ブロックが呼び出されたときに使用可能であることを保証します。

uses配列内で完全修飾名を使用する必要があることに注意してください。

buildtoolを使用していないため、テストできませんが、動作するはずです。


@bhovhannesによって提供されたコメントの例からの更新

bhovhannes: build.xmlにコードを追加しました。このコードは、sencha app buildを実行するときに、コントローラーのすべての名前をuses配列に収集します。このように、開発中にuses配列に何も入力せず、コントローラーをコントローラーフォルダーに追加するだけです。これは、すべてのコントローラーが アプリ

app.js

Ext.application({
    name: 'MyApp',
    appFolder: 'app',

    controllers: [
        "main.App"
    ],

    uses: [
        /*ant-generated-content-start*/ /*ant-generated-content-end*/
    ],

    autoCreateViewport: true,
});

build.xml

<?xml version="1.0" encoding="utf-8"?>
<project name="MyApp" default=".help">
    <import file="${basedir}/.sencha/app/build-impl.xml"/>

    <target name="-before-build">

        <echo message="Collecting all controllers in application class property ... "/>
        <fileset id="app_controllers" dir="${app.dir}/app/controller" casesensitive="yes">
            <include name="**/*.js"/>
        </fileset>
        <pathconvert pathsep="," property="app_controller_names" refid="app_controllers" targetos="unix">
            <chainedmapper>
                <globmapper from="${app.dir}/app/*" to="${ant.project.name}/*" casesensitive="no" handledirsep="yes"/>
                <chainedmapper>
                    <regexpmapper from="^(.*)\.js$$" to='"\1"'/>
                    <filtermapper>
                        <replacestring from="/" to="."/>
                        <replacestring from="\" to="."/>
                    </filtermapper>
                </chainedmapper>
            </chainedmapper>
        </pathconvert>
        <echo message="Collected controllers: ${app_controller_names}"/>

        <echo message="Injecting into app.js ..."/>
        <replaceregexp file="${app.dir}/app/app.js"
                       match="/\*ant-generated-content-start\*/(.*)/\*ant-generated-content-end\*/"
                       replace="/*ant-generated-content-start*/ ${app_controller_names} /*ant-generated-content-end*/"
                       byline="true"
                />
    </target>

    <target name="-after-build">
        <echo message="Reverting to original app.js ..."/>
        <replaceregexp file="${app.dir}/app/app.js"
                       match="/\*ant-generated-content-start\*/(.*)/\*ant-generated-content-end\*/"
                       replace="/*ant-generated-content-start*/ /*ant-generated-content-end*/"
                       byline="true"
                />
    </target>

</project>
于 2013-01-22T11:45:08.557 に答える