1

「親」アプリケーション内に「子」アプリケーションをロードするにはどうすればよいですか?

Frame私は、といくつかの子アプリケーションと呼ばれるこのメインアプリケーションを持っています。フレームにはボーダーレイアウトがあります。左側には、他のプロジェクトをロードするためのいくつかのボタン(メニューなど)があります。中央には私の子プロジェクトのコンテナがあります。フレームプロジェクトにはデフォルトのMVC構造があります。

フォルダの中にアプリケーションを入れましたTest。また、デフォルトの構造。

/frame/app/controller
          /view
      /test/app/controller
               /store
               /model
               /view
           /css
           /app.html
           /app.js
      /test2/app/controller
               /store
               /model
               /view
           /css
           /app.html
           /app.js
      /css
      /app.html
      /app.js

このようなもの。

次に、子プロジェクトのフレームのボタンからロードしたいと思いました。

したがって、私の関数は次のようになります。

function(){
   Ext.require('Test.view.testMainContainer', function(){
       var toPutInMyContainer = Ext.create('Test.view.testMainContainer');
       console.log(toPutInMyContainer);
   });
}

このコードには2つの間違いがあります。

  1. jsはtest/ app /view/ testMainContainer.jsにあります
  2. 関数が起動することはありません...

最良の構造は何ですか?これにどのようにアプローチする必要がありますか?

次にやりたいのは、コントローラー、モデル、ストア、ビューに必要なtestMainContainerの内部で、必要に応じてそれらを自動的にロードしたいと思います。

4

1 に答える 1

2

これを達成するためのさまざまな戦略があります。

タイトルの質問に関しては、Mitchell SimoensによるSubAppDemoを確認することをお勧めします。これは、アプリケーション内にサブアプリケーションをロードする方法を示しています。

同様の、しかし異なるアプローチは、要求に応じてコントローラーを動的にロードすることです。これが私の実行するコードです(アプリケーションオブジェクトの一部):

loadPage: function(aControllerName)
{
    var iController = this.dynamicallyLoadController( aControllerName ),
        iPage = iController.view,
        iContentPanel = this.getContentPanel(),
        iPageIndex = Ext.Array.indexOf(iContentPanel.items, iPage);

    // If the page was not added to the panel, add it.
    if ( iPageIndex == -1 )
        iContentPanel.add( iPage );

    // Select the current active page
    iContentPanel.getLayout().setActiveItem( iPage );
},

dynamicallyLoadController: function(aControllerName)
{
    // See if the controller was already loaded
    var iController = this.controllers.get(aControllerName);

    // If the controller was never loaded before
    if ( !iController )
    {    
        // Dynamically load the controller
        var iController = this.getController(aControllerName);

        // Manually initialise it
        iController.init();
    }

    return iController;
},

コントローラが動的にロードされると、そのすべてのモデルとストアも動的にロードされます。私の場合、私は常にコントローラーの最初のビューを明示的に作成し(つまり、ビューも動的にロードされます)、それをコントローラーのviewプロパティ(コントローラーコード)に挿入します。

init: function()
{
    this.callParent();

    // The dynamically created view is stored as a property
    this.view = this.getView(this.views[0]).create();
},

あなたのコードに関しては、なぜあなたの関数がそもそも起動するのかわかりません。Ext.requireただし、外部に関数を配置すれば機能するはずです。

于 2012-07-11T11:18:06.497 に答える