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这些控制器是动态加载的,没有在我的文件中列出。

为了生成用于部署到服务器的生产版本,我通过在我的应用程序文件夹中发出以下命令来使用 Sencha Cmd:

sencha app build

工具正常完成并将所有文件压缩成一个大的 all-classes.js。问题是我的动态加载的控制器不包含在该文件中。

哪个是使动态加载的控制器(总共超过 100 个)被 Sencha Cmd 缩小和处理的正确方法?

我知道,我可以在我的 中列出它们app.js,或者使用 将它们包含在某些文件中Ext.require,但我正在寻找正确的方法,以便在我的构建中自动包含 100 多个不同的控制器、视图、模型和存储。我相信这是 Ext JS 的其他用户,他们正在创建大型应用程序并且正在以某种方式构建,我将不胜感激任何建议或只是success stories,这将帮助我找到正确的构建方式。

4

1 回答 1

7

我会将所有控制器放入uses阵列中。这些应该强制工具跟踪它们并将它们包含在构建中。另一方面,使用不要求类在定义时可用,但保证它们在调用 onReady(一个在应用程序内)块时可用。

请注意,您需要在 uses 数组中使用完全限定名称!

我不使用构建工具,因此我无法对其进行测试,但它应该可以工作。


从@bhovhannes提供的评论示例更新

bhovhannes:我在 build.xml 中添加了一个代码,当我构建 sencha 应用程序时,它会将我的控制器的所有名称收集到使用数组中。这样我在开发过程中什么都不填写使用数组,只需将控制器添加到控制器文件夹中,因为它们都是从 我的应用程序

应用程序.js

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

    controllers: [
        "main.App"
    ],

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

    autoCreateViewport: true,
});

构建.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 回答