2013-01-22 26 views
9

tôi đã tạo ra một ứng dụng sử dụng Ext JS 4. controllers tài sản trong app.js tôi chỉ chứa bộ điều khiển chính:Sử dụng Sencha Cmd với bộ điều khiển tự động nạp

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 điều khiển tải thêm các bộ điều khiển theo tên sử dụng cách tiếp cận getController() (xem phương thức loadController()). Các bộ điều khiển này được nạp động và không được liệt kê trong tệp index.html của tôi.

Để tạo phiên bản sản xuất để triển khai đến máy chủ Tôi đang sử dụng Sencha Cmd bằng cách phát hành các lệnh sau đây trong thư mục ứng dụng của tôi:

sencha app build 

Tool kết thúc bình thường và nén tất cả các file vào một lớn tất cả các lớp học. js. Vấn đề là các bộ điều khiển được nạp động của tôi không được bao gồm trong tệp đó.

Cách nào chính xác để thực hiện các bộ điều khiển được nạp động (trên 100 tổng số) được Sencha Cmd khai thác và xử lý?

Tôi biết, tôi có thể liệt kê chúng trong app.js hoặc bao gồm trong một số tệp bằng cách sử dụng Ext.require, nhưng tôi đang tìm cách tiếp cận chính xác để bao gồm hơn 100 bộ điều khiển, chế độ xem, mô hình và cửa hàng khác nhau tự động trong bản dựng của mình. Tôi tin rằng đó là những người dùng khác của Ext JS, đang tạo ra các ứng dụng có quy mô lớn và đang xây dựng bằng cách nào đó và tôi sẽ biết ơn mọi đề xuất hoặc chỉ success stories, điều này sẽ giúp tôi tìm ra cách xây dựng chính xác.

Trả lời

7

Tôi sẽ đặt tất cả bộ điều khiển vào mảng uses. Những công cụ này sẽ buộc công cụ theo dõi chúng và đưa chúng vào bản dựng. Mặt khác, sử dụng không yêu cầu lớp học có sẵn vào thời gian định nghĩa nhưng đảm bảo chúng có sẵn vào thời điểm các khối onReady (một trong số các ứng dụng) được (gọi).

Lưu ý rằng bạn sẽ cần sử dụng tên đủ điều kiện trong phạm vi sử dụng !

Tôi không sử dụng công cụ xây dựng do đó tôi không thể kiểm tra nó nhưng nó sẽ hoạt động.


Cập nhật từ các ý kiến ​​dụ được cung cấp bởi @bhovhannes

bhovhannes: Tôi đã thêm một mã trong build.xml, thu thập tất cả các tên của điều khiển của tôi vào sử dụng mảng khi tôi xây dựng ứng dụng sencha. Bằng cách này tôi điền gì trong mảng sử dụng trong quá trình phát triển, chỉ cần thêm bộ điều khiển vào thư mục điều khiển, bởi vì tất cả chúng được nạp tự động từ ứng dụng của tôi

ứng dụng.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

Cám ơn link cho 'uses'. Nó có thể hữu ích. Nhưng theo cách đó tất cả các bộ điều khiển của tôi sẽ được đưa vào thông qua một mảng 'uses' rất lớn. Và điều đó không chỉ làm cho sự phát triển phức tạp hơn (mỗi lần, khi thêm một bộ điều khiển mới, ta cũng nên thêm nó vào phần 'use'), nhưng cũng đặt tất cả các bộ điều khiển vào' all-classes.js', điều này làm cho bộ điều khiển tải tuyệt đối (tại sao tải động, nếu bộ điều khiển đã được tải xuống và có sẵn với tất cả các thứ còn lại trong 'all-classes.js'?) – bhovhannes

+0

@bhovhannes Tôi thấy nhược điểm trong khi phát triển nhưng lưu ý rằng nó chỉ đảm bảo rằng lớp tồn tại. Cá nhân tôi sử dụng phương pháp tiếp cận hướng máy chủ nơi giao diện người dùng được tạo bởi vai trò người dùng. Tôi biết rằng bộ điều khiển của tôi đã ở đó khi tôi gọi cho họ và đó là tất cả những gì bạn cần quan tâm. Nhưng tôi phải thừa nhận rằng tôi không quen với công cụ Sencha CMD. Maybee có một đối số cho phép bạn đưa toàn bộ thư mục vào quá trình xây dựng, đây có thể là giải pháp bạn đang tìm kiếm. – sra

+0

Tôi đã thêm một mã trong tệp build.xml, nó thu thập tất cả tên của các bộ điều khiển của tôi vào mảng 'uses' khi tôi làm' sencha app build'. Bằng cách này, tôi không điền gì vào mảng 'uses' trong quá trình phát triển, chỉ cần thêm bộ điều khiển vào thư mục' controller', vì tất cả chúng được nạp động từ ứng dụng của tôi. – bhovhannes

Các vấn đề liên quan