如何拆分代码以提高可读性?

时间:2017-04-12 14:53:39

标签: javascript extjs extjs4 extjs4.1

我想清理我的代码以获得更好的可读性,并将一些代码放在额外的js文件中,但我尝试过的任何代码都没有。

它是SubApp,是仍在使用ExtJs 4.1的大型项目(Shopware)的一部分。

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

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

createTopToolbar是一个内部的方法" main / window.js"返回带有一些元素的Ext.toolbar.Toolbar。

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

我试图像这样创建一个新的静态/单例类

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'。我只需要一个"包装"为我的" shopCombo"代码并返回' Ext.toolbar.Toolbar'以shopCombo作为项目。

2 个答案:

答案 0 :(得分: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(...)
        }
    }

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

答案 1 :(得分:1)

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

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语句。