Angualr cdk 學(xué)習(xí)之 Stepper

? ? ? ?cdk Stepper 讓我們能夠更好的處理類似于工作流的情況(任務(wù)分為多個步驟央星,上一步操作完成之后進(jìn)入下一步的操作钦讳,比如咱們休假申請單要經(jīng)過多個領(lǐng)導(dǎo)的審批的情況)。

? ? ? ?還是和之前cdk 里面其他功能模塊一樣,要使用Stepper 需provider CdkStepperModule的侠驯。

import {CdkStepperModule} from '@angular/cdk/stepper';

? ? ? ?cdk Stepper看起來復(fù)雜其實里面的東西不是很多脐恩。整個Stepper都是圍繞一個組件CdkStep(cdk-step)和6個指令(CdkStepper镐侯、CdkStepLabel、CdkStepperNext驶冒、CdkStepperPrevious苟翻、CdkStepHeader)來展開的。咱們上面不是說了么骗污,cdk Stepper一般用來處理多個步驟任務(wù)崇猫。這里每個任務(wù)的內(nèi)容用CdkStep組件來表示,所以有多少個步驟就會 有多少個CdkStep組件需忿。CdkStepper指令呢則是用來管理這些組件比如跳到下一步诅炉,上一步,完成等等(所以cdk Stepper使用的時候我們需要另外定義一個組件繼承自CdkStepper指令屋厘,我們可以把他當(dāng)做是工作流組件)涕烧。CdkStepperNext、CdkStepperPrevious兩個指令正好對應(yīng)上一步下一步汗洒,一般會添加在button上面包含在CdkStep組件里面议纯,因為每個步驟都可能有上一步,下一步這樣的仲翎。CdkStepLabel指令則是對每一個步驟的描述你也可以認(rèn)為是每個步驟的標(biāo)題痹扇。CdkStepHeader指令一般則是用來表示當(dāng)前進(jìn)行到哪一步了铛漓。一般也是會自定義一個組件繼承CdkStepHeader實現(xiàn)。

一 CdkStep

? ? ? ?CdkStep其實是一個組件來著鲫构。表示每個步驟的內(nèi)容浓恶。所以任務(wù)有多少步就會有多少個CdkStep。比如如下代碼有兩個步驟所以有兩個CdkStep(cdk-step):

<h1>cdk stepper</h1>
<yx-stepper>
    <cdk-step [stepControl]="frmStep1" #step1="cdkStep">
        <ng-template cdkStepLabel>第一步</ng-template>
        <form #frmStep1="ngForm">
            <input type="text" name="a" value="a"/>
        </form>
        <button style="margin: 8px" cdkStepperNext type="button">下一步</button>
    </cdk-step>
    <cdk-step cdkStep #step2="cdkStep">
        <ng-template cdkStepLabel>第二步</ng-template>
        <form #frmStep2="ngForm">
            <input type="text" name="b" value="b"/>
        </form>
        <button cdkStepperPrevious type="button">上一步</button>
        <button style="margin: 8px" cdkStepperNext type="button">完成</button>
    </cdk-step>
</yx-stepper>

? ? ? ?每個CdkStep組件里面的內(nèi)容對應(yīng)每個步驟的內(nèi)容结笨。

? ? ? ?Selector: cdk-step

? ? ? ?Exported as: cdkStep

1.1 CdkStep組件屬性

屬性 內(nèi)容 解釋
ariaLabel: string @Input('aria-label') 添加aria-label屬性
ariaLabelledby: string @Input('aria-labelledby') 添加aria-labelledby屬性
completed: boolean @Input() 當(dāng)前步驟是否標(biāo)記為完成狀態(tài)
editable: boolean @Input() 當(dāng)前步驟標(biāo)記為完成之后包晰,是否還可以回到該步驟
errorMessage: string @Input() 錯誤信息
hasError: boolean @Input() 是否有錯誤
label: string @Input() 當(dāng)前步驟對應(yīng)的label,和cdkStepLabel指令的作用是一樣的(可以簡單的把他認(rèn)為是步驟的標(biāo)題)
optional: boolean @Input() 當(dāng)前步驟是否是可選的
state: StepState @Input() 當(dāng)前步驟的狀態(tài)
stepControl: AbstractControl @Input() 用于驗證當(dāng)前步驟的合法性
content: TemplateRef<any> 當(dāng)前步驟 試圖元素內(nèi)容
interacted: false 用戶是否看到當(dāng)前步驟內(nèi)容
stepLabel: CdkStepLabel 當(dāng)前步驟label內(nèi)容

1.2 CdkStep組件方法

export declare class CdkStep implements OnChanges {
    ...
    /** 選中當(dāng)前步驟(select哪個步驟則選中那個步驟) */
    select(): void;
    /** 設(shè)置當(dāng)前步驟到無效狀態(tài) */
    reset(): void;
    ...
}

CdkStep組件里面大部分的方法都需要配合我們下面要講的CdkStepper指令來使用

二 CdkStepper

? ? ? ?CdkStepper是一個指令,用來管理所有的步驟炕吸,即CdkStepper是用來管理CdkStep組件的伐憾。一般的做法是自定義一個組件繼承CdkStepper指令。并且CdkStep組件是這個組件的子組件赫模。比如如下的代碼我們定義一個StepperComponent組件繼承CdkStepper指令:

import {
    AfterContentInit,
    ChangeDetectionStrategy,
    Component,
    ContentChildren,
    EventEmitter,
    Output,
    QueryList,
    ViewEncapsulation
} from '@angular/core';
import {AnimationEvent} from '@angular/animations';
import {CdkStep, CdkStepper, StepContentPositionState} from '@angular/cdk/stepper';
import {Subject} from 'rxjs';
import {distinctUntilChanged, takeUntil} from 'rxjs/operators';
import {yxStepperAnimations} from './stepper-animations';

@Component({
    selector: 'yx-stepper',
    templateUrl: './stepper.component.html',
    styleUrls: ['./stepper.component.less'],
    providers: [{provide: CdkStepper, useExisting: StepperComponent}],
    animations: [yxStepperAnimations.horizontalStepTransition],
    encapsulation: ViewEncapsulation.None,
    changeDetection: ChangeDetectionStrategy.OnPush,
})
export class StepperComponent extends CdkStepper implements AfterContentInit {

    /** Steps that the stepper holds. */
    @ContentChildren(CdkStep) _steps: QueryList<CdkStep>;

    /** Event emitted when the current step is done transitioning in. */
    @Output() readonly animationDone: EventEmitter<void> = new EventEmitter<void>();

    _animationDone = new Subject<AnimationEvent>();

    ngAfterContentInit() {

        // Mark the component for change detection whenever the content children query changes
        this._steps.changes.pipe(takeUntil(this._destroyed)).subscribe(() => this._stateChanged());

        this._animationDone.pipe(
            // This needs a `distinctUntilChanged` in order to avoid emitting the same event twice due
            // to a bug in animations where the `.done` callback gets invoked twice on some browsers.
            // See https://github.com/angular/angular/issues/24084
            distinctUntilChanged((x, y) => x.fromState === y.fromState && x.toState === y.toState),
            takeUntil(this._destroyed)
        ).subscribe(event => {
            if ((event.toState as StepContentPositionState) === 'current') {
                this.animationDone.emit();
            }
        });
    }
}

? ? ? ?Selector: [cdkStepper]

? ? ? ?Exported as: cdkStepper

2.1 CdkStepper屬性

屬性 類型 解釋
linear: boolean @Input() 任務(wù)流是否是線性的树肃,前一個任務(wù)完成才能進(jìn)行下一個任務(wù)
selected: CdkStep @Input() 當(dāng)前選中的任務(wù)
selectedIndex: number @Input() 當(dāng)前選中任務(wù)的index
selectionChange: EventEmitter<StepperSelectionEvent> @Output() 選中任務(wù)改變時候的回調(diào)函數(shù)

2.2 CdkStepper方法

export declare class CdkStepper implements AfterViewInit, OnDestroy {
    ...
    /** 切換到下一個任務(wù) */
    next(): void;
    /** 切換到上一個任務(wù) */
    previous(): void;
    /** 重置所有的任務(wù) */
    reset(): void;
    ...
}

關(guān)于CdkStepper的使用更加詳細(xì)的任務(wù)可以參考下下文中代碼鏈接。

三 CdkStepLabel

? ? ? ?指令瀑罗,每個步驟需要顯示的label內(nèi)容胸嘴,比如如下代碼<ng-template cdkStepLabel>第一步</ng-template>部分就是某個任務(wù)的label。

    <cdk-step [stepControl]="frmStep1" #step1="cdkStep">
        <ng-template cdkStepLabel>第一步</ng-template>
        <form #frmStep1="ngForm">
            <input type="text" name="a" value="a"/>
        </form>
        <button style="margin: 8px" cdkStepperNext type="button">下一步</button>
    </cdk-step>

? ? ? ?Selector: [cdkStepLabel]

四 CdkStepperNext

? ? ? ?添加在button上的指令斩祭,跳到下一個任務(wù)劣像。

? ? ? ?Selector: button[cdkStepperNext]

五 CdkStepperPrevious

? ? ? ?添加在button上的指令,跳到上一個任務(wù)摧玫。

? ? ? ?Selector: button[cdkStepperPrevious]

六 CdkStepHeader

? ? ? ?指令耳奕,每個任務(wù)的頭部信息,任務(wù)指示器诬像。


? ? ? ?關(guān)于cdk Stepper部分的內(nèi)容好像也沒啥講的屋群,關(guān)鍵點就在咱們繼承CdkStepper的組件怎么來寫了,怎么來管理這些workflow里面的任務(wù)坏挠。所以最最重要的在代碼實現(xiàn)部分谓晌。為了能讓大家更加直觀的知道cdk Stepper怎么使用,這里我就直接寫了一個非常簡單的例子癞揉。有興趣的大家可以看看例子里面是怎么做到的 https://github.com/tuacy/angular-cdk-study cdk stepper部分內(nèi)容在workflow-stepper文件下面纸肉。實現(xiàn)效果圖如下:

stepper.gif
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市喊熟,隨后出現(xiàn)的幾起案子柏肪,更是在濱河造成了極大的恐慌,老刑警劉巖芥牌,帶你破解...
    沈念sama閱讀 219,039評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件烦味,死亡現(xiàn)場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)谬俄,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,426評論 3 395
  • 文/潘曉璐 我一進(jìn)店門柏靶,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人溃论,你說我怎么就攤上這事屎蜓。” “怎么了钥勋?”我有些...
    開封第一講書人閱讀 165,417評論 0 356
  • 文/不壞的土叔 我叫張陵炬转,是天一觀的道長。 經(jīng)常有香客問我算灸,道長扼劈,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,868評論 1 295
  • 正文 為了忘掉前任菲驴,我火速辦了婚禮荐吵,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘赊瞬。我一直安慰自己捍靠,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 67,892評論 6 392
  • 文/花漫 我一把揭開白布森逮。 她就那樣靜靜地躺著,像睡著了一般磁携。 火紅的嫁衣襯著肌膚如雪褒侧。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,692評論 1 305
  • 那天谊迄,我揣著相機(jī)與錄音闷供,去河邊找鬼。 笑死统诺,一個胖子當(dāng)著我的面吹牛歪脏,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播粮呢,決...
    沈念sama閱讀 40,416評論 3 419
  • 文/蒼蘭香墨 我猛地睜開眼婿失,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了啄寡?” 一聲冷哼從身側(cè)響起豪硅,我...
    開封第一講書人閱讀 39,326評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎挺物,沒想到半個月后懒浮,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,782評論 1 316
  • 正文 獨居荒郊野嶺守林人離奇死亡识藤,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,957評論 3 337
  • 正文 我和宋清朗相戀三年砚著,在試婚紗的時候發(fā)現(xiàn)自己被綠了次伶。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,102評論 1 350
  • 序言:一個原本活蹦亂跳的男人離奇死亡稽穆,死狀恐怖冠王,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情秧骑,我是刑警寧澤版确,帶...
    沈念sama閱讀 35,790評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站乎折,受9級特大地震影響绒疗,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜骂澄,卻給世界環(huán)境...
    茶點故事閱讀 41,442評論 3 331
  • 文/蒙蒙 一吓蘑、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧坟冲,春花似錦磨镶、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,996評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至私痹,卻和暖如春脐嫂,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背紊遵。 一陣腳步聲響...
    開封第一講書人閱讀 33,113評論 1 272
  • 我被黑心中介騙來泰國打工账千, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人暗膜。 一個月前我還...
    沈念sama閱讀 48,332評論 3 373
  • 正文 我出身青樓匀奏,卻偏偏與公主長得像,于是被迫代替她去往敵國和親学搜。 傳聞我的和親對象是個殘疾皇子娃善,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,044評論 2 355

推薦閱讀更多精彩內(nèi)容

  • Swift1> Swift和OC的區(qū)別1.1> Swift沒有地址/指針的概念1.2> 泛型1.3> 類型嚴(yán)謹(jǐn) 對...
    cosWriter閱讀 11,103評論 1 32
  • cdk ally里面提供的功能運(yùn)用場景是 select, menu 這種有 list options 的組件...
    tuacy閱讀 1,167評論 0 1
  • 一、首先我先把集成過程說一下瑞佩。小編想說的話:支付寶是我做支付中覺得坑最多的一個会放,各種編譯不過,各種出問題钉凌。 廢話不...
    左先生丶丶閱讀 10,507評論 5 11
  • 春天來了咧最。3月11-12日,攜同學(xué)10多人去距離重慶320公里的開州十里竹溪春游。 11日早矢沿,我開車并搭上太太及三...
    樊榮強(qiáng)閱讀 375評論 6 6
  • 歡樂頌里面的安迪滥搭,簡直就是女人的榜樣。想到安迪就覺得女人就該努力捣鲸,讓別人不敢隨便欺負(fù)你瑟匆! 安迪的皮膚好,打扮也時尚...
    sarol閱讀 175評論 0 0