如何拆分代码以获得更好的可读性?

How to split up code for better readability?

我想清理我的代码以获得更好的可读性,并将一些代码放入额外的 js 文件中,但我尝试过的任何方法都不起作用。

它是一个子应用程序,是仍在使用 ExtJs 4.1 的更大项目 (Shopware) 的一部分。

我有一个扩展 'Ext.window.Window' 的 "main/window.js"。 initComponent 看起来像这样:

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

createTopToolbar 是 "main/window.js" 中的一个方法,它 return 一个带有一些元素的 Ext.toolbar.Toolbar。

我的目标是将此方法放在一个额外的文件中。

我试过像这样创建一个新的 static/singleton class

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

但在 "main/window.js" 中我不能使用 myapp.myplugin.view.main.Toptoolbar.createTopToolbar() 或 main.Toptoolbar.createTopToolbar()

调用它

在 app.js 中,我尝试像这样包含它

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

但是没用。

我没有使用 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;

}

而且我不希望我的 "main/window.js" 中包含整个代码。 我不确定在这种情况下使用 Jaimee 提供的 xtype 解决方案,因为我没有真正扩展 'Ext.toolbar.Toolbar'。我只需要一个 "wrapper" 作为我的 "shopCombo" 代码和 return 'Ext.toolbar.Toolbar' shopCombo 作为一个项目。

像创建任何其他视图一样创建 toolbar,然后创建 'xtype' 以将其添加到您的 window。

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');
              }
          }
      }
   }]
});

然后只需将其添加到 window 的停靠项中,就像添加任何其他组件一样:

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(...)
        }
    }

但是,如果它是一个可预测的值,我建议只为组合框设置一个起始值。如果您还没有将商店添加到控制器的商店配置中,则需要将其添加。

您可以像这样使用工厂模式:

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

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

    }
} 
});

然后你可以这样创建工具栏:

initComponent: function () {
   //...
   me.dockedItems = [
      ToolbarFactory.factory();
   ];
   //...
}

根据您的构建过程,您可能需要添加 requires 语句。