2013-01-22 143 views
9

我已经在我的app.js创建使用的Ext JS 4 controllers属性的应用程序只包含主控制器:使用Sencha Cmd的具有动态加载控制器

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文件中列出。

为了生成量产版本部署到服务器我使用煎茶Cmd的在我的应用程序文件夹中发出以下命令:

sencha app build 

工具正常完成和压缩所有文件合并成一个大的所有类。 JS。问题是我的动态加载的控制器不包含在该文件中。

哪种方法可以使动态加载的控制器(总数超过100个)被Sencha Cmd缩小和处理?

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

回答

7

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

请注意,您将需要使用 使用数组中的全限定名!

我不使用buildtool因此我不能测试它,但它应该工作。从评论


更新例如通过@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, 
}); 

的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> 
+1

感谢链接'uses'。它可以是有用的。但那样我所有的控制器都将通过一个巨大的'uses'数组来包含。这不仅使开发变得更加复杂(每当添加一个新的控制器时,还应该将其添加到'uses'部分中),而且还将所有控制器放入'all-classes.js'中,这使得动态控制器加载绝对(为什么要动态加载,如果控制器已经下载,并且可以在'all-classes.js'中使用所有剩余的东西?) – bhovhannes

+0

@bhovhannes我在开发时看到了不足之处,但请注意,它只是确保该类存在。我个人使用由服务器端驱动的方法,其中前端由用户角色创建。我知道当我给他们打电话时,我的控制器已经在那里了,这就是你应该关心的。但我必须承认,我并不习惯Sencha CMD工具。也许有一个参数可以让你在构建过程中包含整个文件夹,这可能是你正在寻找的解决方案。 – sra

+0

我在build.xml中添加了一个代码,当我执行'sencha app build'时,它将我的控制器的所有名称收集到'uses'数组中。这样我在开发过程中就不用填写'uses'数组,只需将控制器添加到'controller'文件夹中,因为它们都是从我的应用程序动态加载的。 – bhovhannes