2017-04-12 6 views
0

私はコードを読みやすくするためにクリーンアップし、余分なjsファイルにいくつかのコードを入れたいのですが、私が試したことはありませんでした。読みやすくするためにコードを分割する方法は?

これはSubAppであり、まだExtJs 4.1を使用している大きなプロジェクト(Shopware)の一部です。

私は「拡張子.window.Window」を拡張する「main/window.js」を持っています。 initComponentは次のようになります。

initComponent: function() { 
    //... 
    me.dockedItems = [ 
     me.createTopToolbar(), 
    ]; 
    //... 
} 

createTopToolbarは、いくつかの要素でExt.toolbar.Toolbarを返す「/メインwindow.js」内部メソッドです。

私の目標は、このメソッドを余分なファイルに入れることです。

私はこの

Ext.define('myapp.myplugin.view.main.Toptoolbar', { 
    singleton: true, 
    createTopToolbar: function(){ 
     // ... 
     return toolbar; 
    } 

しかし)「メイン/ window.js」私はmyapp.myplugin.view.main.Toptoolbar.createTopToolbarを(使用して、それを呼び出すことはできません内部のような新しい静的/シングルトンクラスを作成してみました、又はmain.Toptoolbar.createTopToolbar()

app.jsで私はこの

views: [ 
    'main.Window', 
    'main.Toptoolbar', 
], 

ようにそれを含めることを試みたが、それは仕事をdoesntの。

私はExtJsの経験がなく、何時間も検索しています...誰かが私を助けてくれることを願っています。

はありがとう

編集

私は関数内でツールバーを構築していますなぜ疑問に答えるために。 全体の機能次のようになります。

createTopToolbar: function() { 
    var me = this; 

    var shopStore = Ext.create('Shopware.apps.Base.store.Shop'); 

    shopStore.filters.clear(); 
    shopStore.load({ 
     callback: function(records) { 
      shopCombo.setValue(records[0].get('id')); 
     } 
    }); 

    var shopCombo = Ext.create('Ext.form.field.ComboBox', { 
     name: 'shop-combo', 
     fieldLabel: 'Shop', 
     store: shopStore, 
     labelAlign: 'right', 
     labelStyle: 'margin-top: 2px', 
     queryMode: 'local', 
     valueField: 'id', 
     editable: false, 
     displayField: 'name', 
     listeners: { 
      'select': function() { 
       if (this.store.getAt('0')) { 
        me.fireEvent('changeShop'); 
       } 
      } 
     } 
    }); 

    var toolbar = Ext.create('Ext.toolbar.Toolbar', { 
     dock: 'top', 
     ui: 'shopware-ui', 
     items: [ 
      '->', 
      shopCombo 
     ] 
    }); 

    return toolbar; 

}

と私は私の「メイン/ window.js」内部コード全体をたくありません。 私は本当に 'Ext.toolbar.Toolbar'を拡張していないので、このコンテキストではJaimeeが提供するxtypeソリューションを使用しているかどうかはわかりません。私はちょうど私の "shopCombo"コードの "ラッパー"を必要とし、アイテムとしてshopComboで 'Ext.toolbar.Toolbar'を返します。

+0

なぜ機能内にツールバーを構築しているのか不思議ですが、その動機づけを説明できますか? – Jaimee

+0

@Jaimee私は私のモチベーションを説明するために私の元の質問を編集しました。 – Manuel

+0

これには2つの良いパターンがあります。 xtypeが参照する新しいビューとしてツールバーを作成したり、mixinとして追加することができます。 – Alexander

答えて

2

他のビューと同じようにtoolbarを作成し、 'xtype'を作成してウィンドウに追加します。

Ext.define('myapp.myplugin.view.main.Toptoolbar', { 
    extends: 'Ext.toolbar.Toolbar', 
    xtype: 'mytoptoolbar', 
    dock: 'top', 
    ui: 'shopware-ui', 
    items :[ 
     '->', 
     { 
     xtype: 'combobox', 
     name: 'shop-combo', 
     fieldLabel: 'Shop', 
     store: 'shopStore', 
     labelAlign: 'right', 
     labelStyle: 'margin-top: 2px', 
     queryMode: 'local', 
     valueField: 'id', 
     editable: false, 
     displayField: 'name', 
     listeners: { 
      'select': function() { 
       if (this.store.getAt('0')) { 
        me.fireEvent('changeShop'); 
       } 
      } 
     } 
    }] 
}); 

そして単にあなたのようなあなたのウィンドウのドッキングアイテムに追加し、他の構成要素になります。

initComponent: function() { 
    //... 
    me.dockedItems = [ 
     { 
      xtype: 'mytoptoolbar' 
     } 
    ]; 
    //... 
} 

と負荷リスナーがストアに追加することができます。

Ext.define('Shopware.apps.Base.store.Shop', { 
    // .... 
    listeners: 
    { 
     load: function() { 
      Ext.ComponentQuery.query("combobox[name='shop-combo']")[0].setValue(...) 
     } 
    } 

ただし、予測可能な値であれば、コンボボックスの開始値を設定することをおすすめします。まだ店舗の店舗設定​​に店舗を追加する必要があります。

+0

ありがとうございます。私はこれを知っていましたが、それは私にとって良い解決策のように感じません。これを行うには、私は奇妙な感じがする新しい機能を追加せずにクラス(Ext.toolbar.Toolbar)を拡張しています。私は問題を明確にするために質問を広げます。 – Manuel

+0

@Manuel私はあなたが提供した新しい情報で私の答えを改訂しました。クラスを拡張することで、独自のコンフィグを追加し、アプリケーション内のビューに簡単に追加できるカスタムコンポーネントを作成できます。目標を分割してコードを単純化することをお勧めします。クラスを拡張するために大規模な変更を行う必要はありません。 – Jaimee

+0

コードと解説をいただきありがとうございます。 – Manuel

1

あなたがそうのようなファクトリパターンを使用することができます。そして、あなたはツールバーをこの方法で作成することができます

Ext.define('ToolbarFactory', { 
alias : 'main.ToolbarFactory', 
statics : { 

    /** 
    * create the toolbar factory 
    */ 
    factory : function() { 
     console.log('create the toolbar'); 
     var toolbar = ....; 
     return toolbar; 

    } 
} 
}); 

​​

あなたがrequiresステートメントを追加する必要があり、ビルドプロセスに応じ。

+0

ありがとうございます。 – Manuel

関連する問題