【问题标题】:Using Sencha Cmd with dynamically loaded controllers将 Sencha Cmd 与动态加载的控制器一起使用
【发布时间】:2013-01-05 14:54:59
【问题描述】:

我使用 Ext JS 4 创建了一个应用程序。我的app.js 中的controllers 属性仅包含主控制器:

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 将它们包含在某些文件中,但我正在寻找正确的方法,以便在我的建造。我相信这是 Ext JS 的其他用户,他们正在创建大型应用程序并正在以某种方式构建,我将不胜感激任何建议或 success stories,这将帮助我找到正确的构建方式。

【问题讨论】:

    标签: extjs build extjs4 sencha-cmd


    【解决方案1】:

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

    请注意,您需要在 使用数组!

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


    来自 cmets 的更新 @bhovhannes提供的示例

    bhovhannes: 我在 build.xml 中添加了一个代码,它收集了所有 当我进行 sencha 应用程序构建时,我的控制器进入使用数组。这样我 在开发过程中不填写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>
    

    【讨论】:

    • 感谢uses 的链接。它可能很有用。但这样我所有的控制器都将通过一个巨大的uses 数组包含在内。而且这不仅让开发变得更加复杂(每次添加新控制器时,还要将其添加到uses部分),而且将所有控制器都放入all-classes.js中,这使得动态控制器加载绝对(为什么要加载动态的,如果控制器已经下载并且可以在all-classes.js中使用所有剩余的东西?)
    • @bhovhannes 我在开发时看到了不利的一面,但请注意,它只是确保该类存在。我个人使用服务器端驱动的方法,其中前端由用户角色创建。我知道当我打电话给我的控制器时,他们已经在那里了,这就是你应该关心的。但我必须承认,我并不习惯 Sencha CMD 工具。也许有一个论点允许您将整个文件夹包含到构建过程中,这可能是您正在寻找的解决方案。
    • 我在 build.xml 中添加了一个代码,当我执行 sencha app build 时,它会将我的控制器的所有名称收集到 uses 数组中。这样我在开发过程中不会在uses 数组中填写任何内容,只需将控制器添加到controller 文件夹中,因为它们都是从我的应用程序动态加载的。
    • @JosvicZammit,看看pastebin.com/22AmTU0rpastebin.com/GCeg1ber。第一个是我的 app.js,第二个是我的 build.xml。我所有的控制器都位于 /app/controller 文件夹中,只有 main.App 控制器在启动时加载
    • @bhovhannes 感谢分享!如果您不介意,我会将该代码添加到 SO 中,以便提供更好的质量
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-12-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多