Ext经验分享(1)

最近(2017年10月26日)在开发MES项目。使用的是Ext3.3.1。
下图是我的需求(实际上是已经做好的)~


MPM1700—需求.png

需求是一个分栏页面,左侧为菜单栏,右侧是数据面板。要求根据用户在左侧选择的不同菜单,右侧改变为相应的数据面版。

在使用Ext编写这段需求时遇到了如下一些困难,逐一解决后,将经验在这里分享下。

经验一 : 关于BorderLayout中增删组件

从需求中可以看出使用BORDER布局最为合适,west区域为菜单栏,准备使用Ext的Menu控件,center区域为数据面板。

使用中需要注意下面的这些问题(来自于Ext3 API):

Notes:
  • Any container using the BorderLayout must have a child item with region:'center'. The child item in the center region will always be resized to fill the remaining space not used by the other regions in the layout.
  • Any child items with a region of west or east must have width defined (an integer representing the number of pixels that the region should take up).
  • Any child items with a region of north or south must have height defined.
  • The regions of a BorderLayout are fixed at render time and thereafter, its child Components may not be removed or added. To add/remove Components within a BorderLayout, have them wrapped by an additional Container which is directly managed by the BorderLayout. If the region is to be collapsible, the Container used directly by the BorderLayout manager should be a Panel.

注意引文中的粗体字,即BorterLayout布局中,每个区域的组件不能删除或增加。我在开发中,一开始想的是在换菜单时,如从“计划缺料异常”点到“订单交期异常”,中间面板(centerPanel)的操作是,先删除所有组件。
this.removeAll();
再添加
this.add(...);
如上所述,这个做法是行不通的。中间的组件删除后,面板变空,任我如何添加,都不能把新的组件渲染到页面上去。

正确的做法,写在上文的斜体字中。即在Center区域中增加一个Panel。Layout为Auto,或者Box的等,只要不是Border的就行。然后将需要添加和删除的组件new到这个Panel的items里。

//这里定义centerPanel
this.centerPanel = new Ext.Panel({  
  id : 'centerPanel',  
  layout: {  
    type: 'hbox',  
    align: 'stretch'  
  },  
  region : 'center',
  renderTo: Ext.getCmp('main'),
  //item中的组件要重新New,传参会shallow copy
  items: [
    new rs.mpm.planImpStatus.planLackM.GridPanel({
      id : 'planLackMPanel',
      title : '计划缺料异常',
      flex: 100
    })
  ]
});
                 //这里是点击菜单事件的监听器
                 fn: function(item,e) {
                  // 点击某个菜单项,将该菜单项背景颜色加深
                  item.addClass('item_actived');
                  Ext.getCmp('orderDeliveryItem').removeClass('item_actived');
                  Ext.getCmp('preparationItem').removeClass('item_actived');
                  // 去除centerPanel中的面板,换成与该菜单项相对应的面板
                  this.centerPanel.removeAll();
                  this.centerPanel.add(
                    new rs.mpm.planImpStatus.planLackM.GridPanel({
                      id : 'planLackMPanel',
                      title : '计划缺料异常',
                    })
                 );
                 this.centerPanel.doLayout();
                }

在定义的centerPanel中,就可以完美的进行添加删除组件了。

经验二 : 在Ext中添加样式,即使用CSS

Ext的组件都是封装过了,这样虽然使用起来方便,但是遇到特殊的需求时,比如说更改为某个特定的样式,这类问题就比较棘手。
例如,这个需求需要在点击后将按钮的背景颜色变深。CSS很好写:

        .x-menu-item.menu_item{
            color:black!important;
            font-size: larger;
         }
        .item_actived{
            background-color :#D0DEF0
        }
        .item_margin{
          margin-bottom: 10px
        }

ps:第一段CSS是设置菜单字体的。字体颜色的设置为了抵消掉项目中的maincss.css需要加上!important才能生效

问题的关键是如何正确使用CSS属性将这段CSS添加到正确的位置。因为你用EXT组件写前端,是接触不了HTML的嘛。
EXT代码:

this.menuPanel = new Ext.menu.Menu({
  region : 'west',
  width : 220,
  plain: true,
  floating: false,
  style : "padding-top:10px",
  items : [
    {
      id : 'planLackMItem',
      text: '计划缺料异常',
      //针对该菜单项的CSS 
      cls : 'menu_item',
      //针对包含菜单项的容器的CSS 
  • ctCls : 'item_margin', listeners : ......
  • MENU菜单生成的HTML代码

    整个Menu组件转化的HTML代码如上图所示,简要来说div中包含ul

    <!-- Menu组件以DIV标签开始 -->
      

    你可能感兴趣的:(Ext经验分享(1))