Ext.js4.2.1 Ext.container.Container

百聯達發表於2017-08-14
一:簡介

任何包含其它元件的元件的基類,容器最基本的操作包括對其內部元件進行新增,插入和刪除。

最常用的容器類包含Ext.panel.Panel,Ext.window.Window,和Ext.tab.Panel.

可以簡單的建立一個容器:

點選(此處)摺疊或開啟

  1. // 顯式建立一個容器
  2. Ext.create('Ext.container.Container', {
  3.     layout: {
  4.         type: 'hbox'
  5.     },
  6.     width: 400,
  7.     renderTo: Ext.getBody(),
  8.     border: 1,
  9.     style: {borderColor:'#000000', borderStyle:'solid', borderWidth:'1px'},
  10.     defaults: {
  11.         labelWidth: 80,
  12.         // 隱式建立容器透過指定的xtype
  13.         xtype: 'datefield',
  14.         flex: 1,
  15.         style: {
  16.             padding: '10px'
  17.         }
  18.     },
  19.     items: [{
  20.         xtype: 'datefield',
  21.         name: 'startDate',
  22.         fieldLabel: 'Start date'
  23.     },{
  24.         xtype: 'datefield',
  25.         name: 'endDate',
  26.         fieldLabel: 'End date'
  27.     }]
  28. });

二:Layout

容器類把子元件的渲染任務賦予給了一個layout管理類,必須透過一個layout配置屬性配置到容器當中。

當為容器新增子item或者動態的新增元件時,需要考慮如何組織他們的佈局和大小。預設情況下,容器會按先後順序進行佈局。

某些容器允許動態的新增子元件,但是下面的這些容器卻不允許:Ext.layout.container.Card,Ext.layout.container.Anchor,Ext.layout.container.VBox, Ext.layout.container.HBox,
和Ext.layout.container.Table。

layout列舉值:

1.absolute:  透過座標位置來佈局


點選(此處)摺疊或開啟

  1. Ext.create('Ext.panel.Panel',{
  2.      layout:'absolute',
  3.      title:'Ext.layout.container.Absolute佈局示例',
  4.      frame:false,
  5.      height:150,
  6.      width:300,
  7.      renderTo:Ext.getBody(),
  8.      defaults:{
  9.      frame:true,
  10.      height:70,
  11.      width:100,
  12.      bodyStyle:'background-color:#FFFFFF;padding:15px'//設定皮膚體的背景色
  13.      },
  14.      items:[{
  15.      x:10,//橫座標為距父容器左邊緣10畫素的位置
  16.      y:10,//縱座標為距父容器上邊緣10畫素的位置
  17.      html:'子皮膚一',
  18.      title:'子皮膚一'
  19.      },{
  20.      x:130,//橫座標為距父容器左邊緣130畫素的位置
  21.      y:40,//縱座標為距父容器上邊緣40畫素的位置
  22.      html:'子皮膚二',
  23.      title:'子皮膚二'
  24.      }]
  25.     
  26.      })

2.accorion: 摺疊式佈局,每次只能有一個展開


點選(此處)摺疊或開啟

  1. Ext.create("Ext.panel.Panel", {
  2.             title: "Ext.layout.container.Accordion示例",
  3.             frame: true,
  4.             width: 300,
  5.             height: 200,
  6.             renderTo: Ext.getBody(),
  7.             bodyPadding: 5,
  8.             layout: "accordion",
  9.             defaults: {
  10.                 bodyStyle: "background-color:#FFFFFF"
  11.             },
  12.             items: [{
  13.                 title: "巢狀皮膚一",
  14.                 html: "皮膚一"
  15.             }, {
  16.                 title: "巢狀皮膚二",
  17.                 html: "皮膚二"
  18.             }, {
  19.                 title: "巢狀皮膚三",
  20.                 html: "皮膚三"
  21.             }]
  22.         });
3.anchor: 根據容器的相對位置佈局


點選(此處)摺疊或開啟

  1. Ext.create('Ext.Panel', {
  2.     width: 500,
  3.     height: 400,
  4.     title: "AnchorLayout Panel",
  5.     layout: 'anchor',
  6.     renderTo: Ext.getBody(),
  7.     items: [
  8.         {
  9.             xtype: 'panel',
  10.             title: '75% Width and 20% Height',
  11.             anchor: '75% 20%'
  12.         },
  13.         {
  14.             xtype: 'panel',
  15.             title: 'Offset -300 Width & -200 Height',
  16.             anchor: '-300 -200'
  17.         },
  18.         {
  19.             xtype: 'panel',
  20.             title: 'Mixed Offset and Percent',
  21.             anchor: '-250 20%'
  22.         }
  23.     ]
  24. });
4.auto: 未指定layout屬性的容器預設的佈局方式

點選(此處)摺疊或開啟

  1. Ext.create('Ext.Panel', {
  2.     width: 500,
  3.     height: 280,
  4.     title: "AutoLayout Panel",
  5.     layout: 'auto',
  6.     renderTo: document.body,
  7.     items: [{
  8.         xtype: 'panel',
  9.         title: 'Top Inner Panel',
  10.         width: '75%',
  11.         height: 90
  12.     },
  13.     {
  14.         xtype: 'panel',
  15.         title: 'Bottom Inner Panel',
  16.         width: '75%',
  17.         height: 90
  18.     }]
  19. });

5.border:這是一個支援多層巢狀皮膚,區域之間的自動形成一個多窗格,面向應用的UI佈局風格內建的展開和摺疊區域。佈局將介面分為上下左右中五個區域,分別用north、south、west、east、center來表示,它的每個子項用region指定元素的位置。


點選(此處)摺疊或開啟

  1. Ext.create('Ext.panel.Panel', {
  2.          width: 500,
  3.          height: 300,
  4.          title: 'Border Layout',
  5.          layout: 'border',
  6.          defaults :{
  7.              style : {borderStyle:'solid'}
  8.          },
  9.          items: [{
  10.          title: 'South Region is resizable',
  11.          region: 'south', // position for region
  12.          xtype: 'panel',
  13.          height: 100,
  14.          split: true, // enable resizing
  15.          margins: '0 5 5 5'
  16.          },{
  17.          // xtype: 'panel' implied by default
  18.          title: 'West Region is collapsible',
  19.          region:'west',
  20.          xtype: 'panel',
  21.          margins: '5 0 0 5',
  22.          width: 200,
  23.          collapsible: true, // make collapsible
  24.          id: 'west-region-container',
  25.          layout: 'fit'
  26.          },{
  27.          title: 'Center Region',
  28.          region: 'center', // center region is required, no width/height specified
  29.          xtype: 'panel',
  30.          layout: 'fit',
  31.          margins: '5 5 0 0'
  32.          }],
  33.          renderTo: Ext.getBody()
  34.         })

6.box: HBox,VBox的基礎類

7.card:這種佈局管理多個子元件,每個裝到集裝箱,其中只有一個子元件可以在任何給定的時間是可見的。這種佈局的樣式是最常用的嚮導,標籤的實現等


點選(此處)摺疊或開啟

  1. var p = Ext.create('Ext.panel.Panel', {
  2.          layout: 'card',
  3.          items: [
  4.          { html: 'Card 1' },
  5.          { html: 'Card 2' }
  6.          ],
  7.          renderTo: Ext.getBody()
  8.         });

  9.         p.getLayout().setActiveItem(0)
8.checkboxgroup: 該種佈局的實現類為Ext.form.CheckboxGroup和Ext.form.RadioGroup


點選(此處)摺疊或開啟

  1. Ext.create('Ext.form.CheckboxGroup', {
  2.             id : 'myGroup',
  3.             xtype : 'checkboxgroup',
  4.             renderTo : Ext.getBody(),
  5.             fieldLabel : 'Single Column',
  6.             itemCls : 'x-check-group-alt',
  7.             columns : 3,
  8.             items : [ {
  9.                 boxLabel : '唱歌',
  10.                 name : '1'
  11.             }, {
  12.                 boxLabel : '游泳',
  13.                 name : '2',
  14.                 checked : true
  15.             }, {
  16.                 boxLabel : '看書',
  17.                 name : '3'
  18.             }, {
  19.                 boxLabel : '旅遊',
  20.                 name : '4'
  21.             }, {
  22.                 boxLabel : '遊戲',
  23.                 name : '5'
  24.             }, {
  25.                 boxLabel : '睡覺',
  26.                 name : '6'
  27.             } ]
  28.         })

9.把整個容器看成一列,然後向容器放入子元素


點選(此處)摺疊或開啟

  1. Ext.create('Ext.panel.Panel', {
  2.          title: 'Column Layout - Percentage Only',
  3.          width: 350,
  4.          height: 250,
  5.          layout:'column',
  6.          items: [{
  7.          title: 'Column 1',
  8.          columnWidth: 0.25
  9.          },{
  10.          title: 'Column 2',
  11.          columnWidth: 0.55
  12.          },{
  13.          title: 'Column 3',
  14.          columnWidth: 0.20
  15.          }],
  16.          renderTo: Ext.getBody()
  17.         });

10.container: 自定義佈局的基礎類

11.fit:Fit Layout 是很常用的一種佈局,在Fit佈局中,子元素將自動填滿整個父容器。
如果在Fit 佈局中放置了多個元件,則只會顯示第一個子元素。典型的案例就是當客戶要求一個window或panel中放置一個GRID元件,grid元件的大小會隨著父容器的大小改變而改變。


點選(此處)摺疊或開啟

  1. Ext.create('Ext.panel.Panel', {
  2.          title: 'Fit Layout',
  3.          width: 300,
  4.          height: 150,
  5.          layout:'fit',
  6.          items: {
  7.          title: 'Inner Panel',
  8.          html: 'This is the inner panel content',
  9.          bodyPadding: 20,
  10.          border: false
  11.          },
  12.          renderTo: Ext.getBody()
  13.         });

12.form: 表單佈局


點選(此處)摺疊或開啟

  1. Ext.create('Ext.Panel', {
  2.             width : 500,
  3.             height : 300,
  4.             title : "FormLayout Panel",
  5.             layout : 'form',
  6.             renderTo : Ext.getBody(),
  7.             bodyPadding : 5,
  8.             defaultType : 'textfield',
  9.             items : [ {
  10.                 fieldLabel : 'First Name',
  11.                 name : 'first',
  12.                 allowBlank : false
  13.             }, {
  14.                 fieldLabel : 'Last Name',
  15.                 name : 'last'
  16.             }, {
  17.                 fieldLabel : 'Company',
  18.                 name : 'company'
  19.             }, {
  20.                 fieldLabel : 'Email',
  21.                 name : 'email',
  22.                 vtype : 'email'
  23.             }, {
  24.                 fieldLabel : 'DOB',
  25.                 name : 'dob',
  26.                 xtype : 'datefield'
  27.             }, {
  28.                 fieldLabel : 'Age',
  29.                 name : 'age',
  30.                 xtype : 'numberfield',
  31.                 minValue : 0,
  32.                 maxValue : 100
  33.             }, {
  34.                 xtype : 'timefield',
  35.                 fieldLabel : 'Time',
  36.                 name : 'time',
  37.                 minValue : '8:00am',
  38.                 maxValue : '6:00pm'
  39.             } ],
  40.             renderTo : Ext.getBody()
  41.         });
13.hbox:橫向排列跨越容器專案的佈局。這種佈局劃分可選包含數字柔性配置的子項之間的可用的水平空間


點選(此處)摺疊或開啟

  1. Ext.create('Ext.Panel', {
  2.          width: 500,
  3.          height: 300,
  4.          title: "HBoxLayout Panel",
  5.          layout: {
  6.          type: 'hbox',
  7.          align: 'stretch'
  8.          },
  9.          renderTo: document.body,
  10.          items: [{
  11.          xtype: 'panel',
  12.          title: 'Inner Panel One',
  13.          flex: 2
  14.          },{
  15.          xtype: 'panel',
  16.          title: 'Inner Panel Two',
  17.          flex: 1
  18.          },{
  19.          xtype: 'panel',
  20.          title: 'Inner Panel Three',
  21.          flex: 1
  22.          }],
  23.          renderTo: btn10
  24.         });

14.table:Table Layout 將內容繪製在table標籤中,table的列數可以指定,還可以透過設定rowSpan和colSpan來建立複雜的佈局


點選(此處)摺疊或開啟

  1. Ext.create('Ext.panel.Panel', {
  2.          title: 'Table Layout',
  3.          width: 300,
  4.          height: 150,
  5.          layout: {
  6.          type: 'table',
  7.          columns: 3
  8.          },
  9.          defaults: {
  10.          bodyStyle: 'padding:20px;',
  11.          borderStyle:'solid'
  12.          },
  13.          items: [{
  14.          html: 'Cell A content',
  15.          rowspan: 2
  16.          },{
  17.          html: 'Cell B content',
  18.          colspan: 2
  19.          },{
  20.          html: 'Cell C content',
  21.          cellCls: 'highlight'
  22.          },{
  23.          html: 'Cell D content'
  24.          }],
  25.          renderTo: Ext.getBody()
  26.         });

15.vbox:以垂直的方式組織所有子元素。它的子元素可以透過align屬性來設定對齊方式,vbox的對齊方式有:
left : 左對齊,預設對其方式
center : 中間對齊
right : 右對齊
stretch : 以父容器的寬度拉伸對齊
stretchmax : 以所有子元素中的最大寬度拉伸對齊


點選(此處)摺疊或開啟

  1. Ext.create('Ext.Panel', {
  2.          width: 500,
  3.          height: 400,
  4.          title: "VBoxLayout Panel",
  5.          layout: {
  6.          type: 'vbox',
  7.          align: 'center'
  8.          },
  9.          renderTo: document.body,
  10.          items: [{
  11.          xtype: 'panel',
  12.          title: 'Inner Panel One',
  13.          width: 250,
  14.          flex: 2
  15.          },
  16.          {
  17.          xtype: 'panel',
  18.          title: 'Inner Panel Two',
  19.          width: 250,
  20.          flex: 4
  21.          },
  22.          {
  23.          xtype: 'panel',
  24.          title: 'Inner Panel Three',
  25.          width: '50%',
  26.          flex: 4
  27.          }],
  28.          renderTo: btn9
  29.         });


三:Config

1.activeItem:String/Number(子元件id 或者是子元件所在容器的索引)


設定該屬性的目的是設定那個子元件在最初顯示的容器的佈局上渲染. 如:activeItem: 'itemId-1' or activeItem: 0 (容器中的第一個子元件).


適用於一次只能顯示一個item的佈局樣式,如Ext.layout.container.Card 或Ext.layout.container.Fit 


2.anchorSize


錨點的大小


3.autoDestory:Boolean


預設為true,表示自動銷燬容器內的所有子元件


4.defaults


對所有透過add或insert新增的item設定統一的屬性。


預設屬性將會應用到所有的子元件上,但是不會覆蓋子元件本身已經有的屬性。


如:
用法:  
defaults: { // defaults 將會應用所有的子元件上,而不是父容器  
    autoScroll: true  
},  
items: [  
    // panel1 已經存在 autoScroll: false 所以 defaults將不會應用  
    {  
        xtype: 'panel',  
        id: 'panel1',  
        autoScroll: false  
    },  
    // panel2 將會 autoScroll: true  
    new Ext.panel.Panel({  
        id: 'panel2'  
    })  
]  


5.items


單個元件,或者是以陣列形式定義的子元件集合 將會自動新增到容器中去


如果開發者沒有配置layout屬性, 預設是按順序將子元件渲染到在容器中,


不考慮子元件的大小和定位。


如果子元件是指定的,它的實際元件的型別將根據xtype選項進行例項化. 每個元件都有各自的xtype.


如果沒有指定 xtype, 那麼將會使用 defaultType,預設是panel.


不要定義contentEl 或者 html作為子元件

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/28624388/viewspace-2143481/,如需轉載,請註明出處,否則將追究法律責任。