• <fieldset id="8imwq"><menu id="8imwq"></menu></fieldset>
  • <bdo id="8imwq"><input id="8imwq"></input></bdo>
    最新文章專題視頻專題問答1問答10問答100問答1000問答2000關(guān)鍵字專題1關(guān)鍵字專題50關(guān)鍵字專題500關(guān)鍵字專題1500TAG最新視頻文章推薦1 推薦3 推薦5 推薦7 推薦9 推薦11 推薦13 推薦15 推薦17 推薦19 推薦21 推薦23 推薦25 推薦27 推薦29 推薦31 推薦33 推薦35 推薦37視頻文章20視頻文章30視頻文章40視頻文章50視頻文章60 視頻文章70視頻文章80視頻文章90視頻文章100視頻文章120視頻文章140 視頻2關(guān)鍵字專題關(guān)鍵字專題tag2tag3文章專題文章專題2文章索引1文章索引2文章索引3文章索引4文章索引5123456789101112131415文章專題3
    問答文章1 問答文章501 問答文章1001 問答文章1501 問答文章2001 問答文章2501 問答文章3001 問答文章3501 問答文章4001 問答文章4501 問答文章5001 問答文章5501 問答文章6001 問答文章6501 問答文章7001 問答文章7501 問答文章8001 問答文章8501 問答文章9001 問答文章9501
    當(dāng)前位置: 首頁 - 科技 - 知識(shí)百科 - 正文

    Angular實(shí)現(xiàn)雙向折疊列表組件的示例代碼

    來源:懂視網(wǎng) 責(zé)編:小采 時(shí)間:2020-11-27 22:25:05
    文檔

    Angular實(shí)現(xiàn)雙向折疊列表組件的示例代碼

    Angular實(shí)現(xiàn)雙向折疊列表組件的示例代碼:最近在做一個(gè)雙向折疊組件,如下圖所示,頁面是分為兩組,左邊頁面是Summary Panel,主要是一組列表,右邊頁面是Detail Panel,展示左邊列表中某一項(xiàng)的具體信息,我們把它記作Middle State。 我們還看到有<和>兩組按鈕,這就是我們要
    推薦度:
    導(dǎo)讀Angular實(shí)現(xiàn)雙向折疊列表組件的示例代碼:最近在做一個(gè)雙向折疊組件,如下圖所示,頁面是分為兩組,左邊頁面是Summary Panel,主要是一組列表,右邊頁面是Detail Panel,展示左邊列表中某一項(xiàng)的具體信息,我們把它記作Middle State。 我們還看到有<和>兩組按鈕,這就是我們要

    最近在做一個(gè)雙向折疊組件,如下圖所示,頁面是分為兩組,左邊頁面是Summary Panel,主要是一組列表,右邊頁面是Detail Panel,展示左邊列表中某一項(xiàng)的具體信息,我們把它記作“Middle State”。

    我們還看到有“<”和“>”兩組按鈕,這就是我們要做的“雙向折疊組件”。點(diǎn)擊左邊的“<”,Summary Panel折疊起來,Detail Panel鋪滿整個(gè)頁面,我們把它記作“Left State”,如下圖:

    在Summary Panel折疊狀態(tài)下,點(diǎn)擊“>”,又回到“Middle State”。點(diǎn)擊“>”,Detail Panel折疊起來,Summary Panel鋪滿整個(gè)頁面,我們把它記作“Right State”,如下圖:

    我們通過以上的需求分析可知,

    1.頁面的總體布局是一個(gè)Summary的div,兩個(gè)箭頭buttons,一個(gè)Detail的div。

    2.頁面總共有三種state:“Middle”、“Left”、“Right”,有兩個(gè)button:“<”和“>”,也就是兩個(gè)button去控制三個(gè)state。

    因此我們需要定義一個(gè)枚舉來記錄頁面的三種狀態(tài)(注意,定義枚舉要用export導(dǎo)出,否則后面會(huì)出錯(cuò))

    export enum CollapseExpandState {
     Middle = 1,
     Left,
     Right
    }

    頁面的結(jié)構(gòu)如下,并且通過一個(gè)變量_collapseExpandState去控制“l(fā)eft”和“right”兩個(gè)button,具體為“<”會(huì)在頁面狀態(tài)為“Middle”和“Right”的情況下出現(xiàn),“>”會(huì)在頁面狀態(tài)為“Middle”和“Left”狀態(tài)下出現(xiàn),從需求圖中即可得知:

    <div id="container">
     <div id="summary"></div>
     <div id="buttons">
     <div id="left" *ngIf="_collapseExpandState === CollapseExpandState.Middle || CollapseExpandState.Right" (click)="_onHandleLeft($event)">《</div>
     <div id="right"> *ngIf="_collapseExpandState === CollapseExpandState.Middle || CollapseExpandState.Left" (click)="_onHandleLeft($event)">》</div>
     </div>
     <div id="detail"></div>
    </div>

    這里在angular的template中用到了枚舉,遭遇了一些麻煩,如果我們按上述定義了枚舉,并且在Angular Component的template中用了枚舉,我們會(huì)得到以下的錯(cuò)誤提示:

    TypeError: Cannot read property 'Middle' of undefined

    也就是說,在Angular2的template中無法識(shí)別定義的枚舉類型CollapseExpandState,這是因?yàn)槟銓懙腁ngular Component的template模板的執(zhí)行環(huán)境是你定義的component class,但是在class中并沒有關(guān)于CollapseExpandState枚舉的任何引用,所以Angular在為你的component生成模板的時(shí)候認(rèn)為CollapseExpandState是undefined的。知道了原因,解決方案就很容易了,只需要在component class中加入這個(gè)枚舉的引用即可:

    @component(...)
    export class ContainerWidget {
     public CollpaseExpandState: any = CollapseExpandState;
    }

    我們通過枚舉狀態(tài)來控制了兩個(gè)buttons是否在恰當(dāng)?shù)捻撁鏍顟B(tài)顯示與否,但是即使是同一個(gè)buttons,在不同的頁面狀態(tài)下所用到的樣式也會(huì)不同,這里的樣式其實(shí)最主要的就是位置了。我們先來考慮如何去控制button的樣式,再來考慮如何去正確定位不同頁面狀態(tài)下button的位置。

    對(duì)于控制button的樣式,我們需要控制三個(gè)樣式:"left button"、"right button"還有“buttons”。能夠想到有三種方案:

    I、用ng-class

    ng-class一般的用法如下:

    <some-element [ngClass]="{'first': true, 'second': true, 'third': false}">...</some-element>

    因此它需要用boolean去控制,每一種樣式需要一個(gè)boolean去控制,left和right各有兩種樣式,buttons有三種樣式,這樣就需要用5個(gè)boolean去控制,略顯麻煩。

    II、 用ElementRef.nativeElement.className

    分別在buttons、left和right上用模板變量,然后在class中定義:

    @ViewChild("buttons") buttons: ElementRef;
    @ViewChild("left") left: ElementRef;
    @ViewChild("right") right: ElementRef;

    在處理函數(shù)中這樣去給class賦值從而改變樣式:

    this.left.nativeElement.className = "XXXXX";

    這樣的話,我們需要從元素的角度出發(fā),只需要3個(gè)元素變量,從而改變?cè)厣系腸lassName即可。但是這樣做有個(gè)隱患,注意到我們是用的ngIf來控制left和right在不同狀態(tài)下是否存在,因?yàn)槊恳淮问录幚矶夹枰獙?duì)三個(gè)元素的樣式進(jìn)行賦值,但是如果某個(gè)頁面狀態(tài)下ngIf為false從而元素不存在,那么就會(huì)報(bào)“Null Pointer”的錯(cuò)誤,所以如果所引用的元素受到了ngIf的控制,不確定是否一定存在的情況下,要慎用該方法為元素賦予樣式。

    III、 用class="{{}}"

    為了II中的尷尬,我們采用在HTML元素上對(duì)class進(jìn)行直接賦值的方式,但是需要借用插值表達(dá)式{{}}。我們?cè)赾ss中用class的形式定義好樣式,并且在compoennt class中定義三個(gè)字符串變量記錄className,然后在事件處理函數(shù)中把相應(yīng)的className賦予變量即可。這樣我們就不用擔(dān)心元素是否存在而導(dǎo)致的空指針了。

    考慮完如何控制樣式,下面我們進(jìn)入CSS樣式的討論,這里其實(shí)主要考慮的就是位置。

    我們采用flex布局,從左到右依次排列Summary Panel, buttons和Detail Panel。我們希望Buttons向左移,但是空出的位置被Detail Panel來填充。首先來看一下不設(shè)樣式的效果圖:

    顯然buttons是占據(jù)了文檔流的位置的,如果這時(shí)候我們用relative定位buttpms,并且設(shè)置left的值為-74px(注意到left為負(fù)數(shù)就會(huì)把元素往左推):

    .buttons{
     display: flex;
     position: relative;
     margin-top: 23px;
     left: -74px;
    }

    效果圖為:

    發(fā)現(xiàn)如果用left的話,buttons原來的文檔流位置依然存在,只是buttons相對(duì)于原來的位置移動(dòng)了一定的位移。

    如果我們用margin-left來設(shè)置呢:

    .buttons{
     display: flex;
     position: relative;
     margin-top: 23px;
     margin-left: -74px;
    }

    效果圖為:

    它和left不同之處在于,left會(huì)留住原來的文檔流位置,但是用margin-left原來的文檔流位置會(huì)消失,而由后面的元素補(bǔ)充過來,而我們想要的效果,正好是用margin-left來實(shí)現(xiàn)的。

    所以用CSS定位的時(shí)候,要明白left和margin-left的區(qū)別,從而選擇正確的方式來定位。

    總結(jié)一下,從這個(gè)案例中我們學(xué)習(xí)到了:

    1. 雙向折疊可以用“3種頁面狀態(tài)去控制2個(gè)按鈕”來實(shí)現(xiàn)
    2. enum在Angular Component的template中用到時(shí),需要在compnent class中添加它的引用
    3. 控制元素樣式有很多方法,要選擇合適的方法
    4. CSS定位中l(wèi)eft和margin-left雖然都能把元素推向左邊,但是left保留原來文檔流位置,margin-left不保留原來文檔流位置。

    聲明:本網(wǎng)頁內(nèi)容旨在傳播知識(shí),若有侵權(quán)等問題請(qǐng)及時(shí)與本網(wǎng)聯(lián)系,我們將在第一時(shí)間刪除處理。TEL:177 7030 7066 E-MAIL:11247931@qq.com

    文檔

    Angular實(shí)現(xiàn)雙向折疊列表組件的示例代碼

    Angular實(shí)現(xiàn)雙向折疊列表組件的示例代碼:最近在做一個(gè)雙向折疊組件,如下圖所示,頁面是分為兩組,左邊頁面是Summary Panel,主要是一組列表,右邊頁面是Detail Panel,展示左邊列表中某一項(xiàng)的具體信息,我們把它記作Middle State。 我們還看到有<和>兩組按鈕,這就是我們要
    推薦度:
    標(biāo)簽: 折疊 雙向 代碼
    • 熱門焦點(diǎn)

    最新推薦

    猜你喜歡

    熱門推薦

    專題
    Top
    主站蜘蛛池模板: 亚洲精品无码专区在线播放 | 亚洲国产精品无码久久久蜜芽| 影院无码人妻精品一区二区| 国产精品久久久久…| 国产亚洲精品拍拍拍拍拍| 日韩精品无码免费一区二区三区| 国产成人无码精品久久久免费| 日韩人妻无码精品一专区| 久久精品国产精品亚洲毛片| 精品日韩欧美国产| 欧美日韩在线亚洲国产精品| 久久精品亚洲精品国产色婷| 久久精品国产亚洲7777| 国产在线精品网址你懂的| 亚洲国产另类久久久精品| 久久99精品久久久久久秒播| 精品国产自在在线在线观看| 久久精品国产亚洲av麻豆色欲 | 午夜精品久久久久成人| 亚洲精品欧美日韩| 国99精品无码一区二区三区| 亚洲AV永久无码精品水牛影视| 精品国产欧美一区二区| 亚洲av日韩精品久久久久久a| 亚洲精品tv久久久久| 青青热久久国产久精品| 欧美精品福利在线视频 | 国产A√精品区二区三区四区| 亚洲国产成人精品不卡青青草原| 国产精品怡红院永久免费| 99re久久精品国产首页2020| 大伊香蕉精品视频在线导航| 国产精品亚洲精品观看不卡| 好属妞这里只有精品久久| 久久久久免费精品国产| 精品久久一区二区| 日本人精品video黑人| 99热都是精品久久久久久| 国产精品亚洲mnbav网站| 久久久久久国产精品美女| 亚洲精品和日本精品|