• Cascader级联选择
    • 何时使用
    • 单独引入此组件
    • 代码演示
    • API
      • nz-cascadercomponent
        • 方法

    Cascader级联选择

    级联选择框。

    何时使用

    • 需要从一组相关联的数据集合进行选择,例如省市区,公司层级,事物分类等。
    • 从一个较大的数据集合中进行选择时,用多级分类进行分隔,方便选择。
    • 比起 Select 组件,可以在同一个浮层中完成选择,有较好的体验。

    单独引入此组件

    想要了解更多关于单独引入组件的内容,可以在快速上手页面进行查看。

    1. import { NzCascaderModule } from 'ng-zorro-antd/cascader';

    代码演示

    Cascader级联选择 - 图1

    基本

    省市区级联。

    1. // tslint:disable:no-any
    2. import { Component, OnInit } from '@angular/core';
    3. const options = [
    4. {
    5. value: 'zhejiang',
    6. label: 'Zhejiang',
    7. children: [
    8. {
    9. value: 'hangzhou',
    10. label: 'Hangzhou',
    11. children: [
    12. {
    13. value: 'xihu',
    14. label: 'West Lake',
    15. isLeaf: true
    16. }
    17. ]
    18. },
    19. {
    20. value: 'ningbo',
    21. label: 'Ningbo',
    22. isLeaf: true
    23. }
    24. ]
    25. },
    26. {
    27. value: 'jiangsu',
    28. label: 'Jiangsu',
    29. children: [
    30. {
    31. value: 'nanjing',
    32. label: 'Nanjing',
    33. children: [
    34. {
    35. value: 'zhonghuamen',
    36. label: 'Zhong Hua Men',
    37. isLeaf: true
    38. }
    39. ]
    40. }
    41. ]
    42. }
    43. ];
    44. const otherOptions = [
    45. {
    46. value: 'fujian',
    47. label: 'Fujian',
    48. children: [
    49. {
    50. value: 'xiamen',
    51. label: 'Xiamen',
    52. children: [
    53. {
    54. value: 'Kulangsu',
    55. label: 'Kulangsu',
    56. isLeaf: true
    57. }
    58. ]
    59. }
    60. ]
    61. },
    62. {
    63. value: 'guangxi',
    64. label: 'Guangxi',
    65. children: [
    66. {
    67. value: 'guilin',
    68. label: 'Guilin',
    69. children: [
    70. {
    71. value: 'Lijiang',
    72. label: 'Li Jiang River',
    73. isLeaf: true
    74. }
    75. ]
    76. }
    77. ]
    78. }
    79. ];
    80. @Component({
    81. selector: 'nz-demo-cascader-basic',
    82. template: `
    83. <nz-cascader [nzOptions]="nzOptions" [(ngModel)]="values" (ngModelChange)="onChanges($event)"> </nz-cascader>
    84. &nbsp;
    85. <a href="javascript:;" (click)="changeNzOptions()" class="change-options">
    86. Change Options
    87. </a>
    88. `,
    89. styles: [
    90. `
    91. .ant-cascader-picker {
    92. width: 300px;
    93. }
    94. .change-options {
    95. display: inline-block;
    96. font-size: 12px;
    97. margin-top: 8px;
    98. }
    99. `
    100. ]
    101. })
    102. export class NzDemoCascaderBasicComponent implements OnInit {
    103. nzOptions: any[] | null = null;
    104. values: any[] | null = null;
    105. ngOnInit(): void {
    106. setTimeout(() => {
    107. this.nzOptions = options;
    108. }, 100);
    109. }
    110. changeNzOptions(): void {
    111. if (this.nzOptions === options) {
    112. this.nzOptions = otherOptions;
    113. } else {
    114. this.nzOptions = options;
    115. }
    116. }
    117. onChanges(values: any): void {
    118. console.log(values, this.values);
    119. }
    120. }

    Cascader级联选择 - 图2

    可以自定义显示

    切换按钮和结果分开。

    1. // tslint:disable:no-any
    2. import { Component } from '@angular/core';
    3. const options = [
    4. {
    5. value: 'zhejiang',
    6. label: 'Zhejiang',
    7. children: [
    8. {
    9. value: 'hangzhou',
    10. label: 'Hangzhou',
    11. children: [
    12. {
    13. value: 'xihu',
    14. label: 'West Lake',
    15. isLeaf: true
    16. }
    17. ]
    18. },
    19. {
    20. value: 'ningbo',
    21. label: 'Ningbo',
    22. isLeaf: true
    23. }
    24. ]
    25. },
    26. {
    27. value: 'jiangsu',
    28. label: 'Jiangsu',
    29. children: [
    30. {
    31. value: 'nanjing',
    32. label: 'Nanjing',
    33. children: [
    34. {
    35. value: 'zhonghuamen',
    36. label: 'Zhong Hua Men',
    37. isLeaf: true
    38. }
    39. ]
    40. }
    41. ]
    42. }
    43. ];
    44. @Component({
    45. selector: 'nz-demo-cascader-trigger',
    46. template: `
    47. {{ text }}
    48. <nz-cascader
    49. [nzShowInput]="false"
    50. [nzOptions]="nzOptions"
    51. [(ngModel)]="values"
    52. (ngModelChange)="onChanges($event)"
    53. (nzSelectionChange)="onSelectionChange($event)"
    54. >
    55. <a href="javascript: void(0)">Change city</a>
    56. </nz-cascader>
    57. `,
    58. styles: [
    59. `
    60. .ant-cascader-picker {
    61. width: 300px;
    62. }
    63. `
    64. ]
    65. })
    66. export class NzDemoCascaderTriggerComponent {
    67. nzOptions = options;
    68. values: any[] | null = null;
    69. text = 'Unselect';
    70. onChanges(values: any): void {
    71. console.log(values, this.values);
    72. }
    73. onSelectionChange(selectedOptions: any[]): void {
    74. this.text = selectedOptions.map(o => o.label).join(', ');
    75. }
    76. }

    Cascader级联选择 - 图3

    禁用选项

    通过指定 options 里的 disabled 字段。

    1. // tslint:disable:no-any
    2. import { Component } from '@angular/core';
    3. const options = [
    4. {
    5. value: 'zhejiang',
    6. label: 'Zhejiang',
    7. children: [
    8. {
    9. value: 'hangzhou',
    10. label: 'Hangzhou',
    11. children: [
    12. {
    13. value: 'xihu',
    14. label: 'West Lake',
    15. isLeaf: true
    16. }
    17. ]
    18. },
    19. {
    20. value: 'ningbo',
    21. label: 'Ningbo',
    22. isLeaf: true
    23. }
    24. ]
    25. },
    26. {
    27. value: 'jiangsu',
    28. label: 'Jiangsu',
    29. disabled: true,
    30. children: [
    31. {
    32. value: 'nanjing',
    33. label: 'Nanjing',
    34. children: [
    35. {
    36. value: 'zhonghuamen',
    37. label: 'Zhong Hua Men',
    38. isLeaf: true
    39. }
    40. ]
    41. }
    42. ]
    43. }
    44. ];
    45. @Component({
    46. selector: 'nz-demo-cascader-disabled',
    47. template: `
    48. <nz-cascader [nzOptions]="nzOptions" [(ngModel)]="values" (ngModelChange)="onChanges($event)"> </nz-cascader>
    49. `,
    50. styles: [
    51. `
    52. .ant-cascader-picker {
    53. width: 300px;
    54. }
    55. `
    56. ]
    57. })
    58. export class NzDemoCascaderDisabledComponent {
    59. nzOptions = options;
    60. values: any[] | null = null;
    61. onChanges(values: any): void {
    62. console.log(values, this.values);
    63. }
    64. }

    Cascader级联选择 - 图4

    大小

    不同大小的级联选择器。

    1. // tslint:disable:no-any
    2. import { Component } from '@angular/core';
    3. const options = [
    4. {
    5. value: 'zhejiang',
    6. label: 'Zhejiang',
    7. children: [
    8. {
    9. value: 'hangzhou',
    10. label: 'Hangzhou',
    11. children: [
    12. {
    13. value: 'xihu',
    14. label: 'West Lake',
    15. isLeaf: true
    16. }
    17. ]
    18. },
    19. {
    20. value: 'ningbo',
    21. label: 'Ningbo',
    22. isLeaf: true
    23. }
    24. ]
    25. },
    26. {
    27. value: 'jiangsu',
    28. label: 'Jiangsu',
    29. children: [
    30. {
    31. value: 'nanjing',
    32. label: 'Nanjing',
    33. children: [
    34. {
    35. value: 'zhonghuamen',
    36. label: 'Zhong Hua Men',
    37. isLeaf: true
    38. }
    39. ]
    40. }
    41. ]
    42. }
    43. ];
    44. @Component({
    45. selector: 'nz-demo-cascader-size',
    46. template: `
    47. <nz-cascader [nzSize]="'large'" [nzOptions]="nzOptions" [(ngModel)]="value1" (ngModelChange)="onChanges($event)">
    48. </nz-cascader>
    49. <nz-cascader [nzOptions]="nzOptions" [(ngModel)]="value2" (ngModelChange)="onChanges($event)"> </nz-cascader>
    50. <nz-cascader [nzSize]="'small'" [nzOptions]="nzOptions" [(ngModel)]="value3" (ngModelChange)="onChanges($event)">
    51. </nz-cascader>
    52. `,
    53. styles: [
    54. `
    55. .ant-cascader-picker {
    56. width: 300px;
    57. margin-bottom: 8px;
    58. }
    59. `
    60. ]
    61. })
    62. export class NzDemoCascaderSizeComponent {
    63. nzOptions = options;
    64. value1: any[] | null = null;
    65. value2: any[] | null = null;
    66. value3: any[] | null = null;
    67. onChanges(values: any): void {
    68. console.log(values);
    69. }
    70. }

    Cascader级联选择 - 图5

    响应表单

    通过表单的重置功能清空已选择的值。

    1. // tslint:disable:no-any
    2. import { Component } from '@angular/core';
    3. import { FormBuilder, FormGroup, Validators } from '@angular/forms';
    4. const options = [
    5. {
    6. value: 'zhejiang',
    7. label: 'Zhejiang',
    8. children: [
    9. {
    10. value: 'hangzhou',
    11. label: 'Hangzhou',
    12. children: [
    13. {
    14. value: 'xihu',
    15. label: 'West Lake',
    16. isLeaf: true
    17. }
    18. ]
    19. },
    20. {
    21. value: 'ningbo',
    22. label: 'Ningbo',
    23. isLeaf: true
    24. }
    25. ]
    26. },
    27. {
    28. value: 'jiangsu',
    29. label: 'Jiangsu',
    30. children: [
    31. {
    32. value: 'nanjing',
    33. label: 'Nanjing',
    34. children: [
    35. {
    36. value: 'zhonghuamen',
    37. label: 'Zhong Hua Men',
    38. isLeaf: true
    39. }
    40. ]
    41. }
    42. ]
    43. }
    44. ];
    45. @Component({
    46. selector: 'nz-demo-cascader-reactive-form',
    47. template: `
    48. <form [formGroup]="form" novalidate>
    49. <nz-cascader [nzOptions]="nzOptions" (nzChange)="onChanges($event)" [formControlName]="'name'"> </nz-cascader>
    50. </form>
    51. <br />
    52. <button nz-button (click)="reset()">Reset</button>
    53. <button nz-button (click)="submit()">Submit</button>
    54. `,
    55. styles: [
    56. `
    57. .ant-cascader-picker {
    58. width: 300px;
    59. }
    60. button {
    61. margin-right: 8px;
    62. }
    63. `
    64. ]
    65. })
    66. export class NzDemoCascaderReactiveFormComponent {
    67. form: FormGroup;
    68. nzOptions = options;
    69. constructor(private fb: FormBuilder) {
    70. this.createForm();
    71. }
    72. private createForm(): void {
    73. this.form = this.fb.group({
    74. name: [null, Validators.required]
    75. });
    76. }
    77. reset(): void {
    78. this.form.reset();
    79. console.log(this.form.value);
    80. }
    81. submit(): void {
    82. console.log(this.form.value);
    83. }
    84. onChanges(values: any): void {
    85. console.log(values);
    86. }
    87. }

    Cascader级联选择 - 图6

    指定选择

    通过函数来判断选项是否可以选择。

    1. // tslint:disable:no-any
    2. import { Component } from '@angular/core';
    3. const options = [
    4. {
    5. value: 'zhejiang',
    6. label: 'Zhejiang',
    7. children: [
    8. {
    9. value: 'hangzhou',
    10. label: 'Hangzhou',
    11. children: [
    12. {
    13. value: 'xihu',
    14. label: 'West Lake',
    15. isLeaf: true
    16. }
    17. ]
    18. },
    19. {
    20. value: 'ningbo',
    21. label: 'Ningbo',
    22. children: [
    23. {
    24. value: 'dongqianlake',
    25. label: 'Dongqian Lake',
    26. isLeaf: true
    27. }
    28. ]
    29. }
    30. ]
    31. },
    32. {
    33. value: 'jiangsu',
    34. label: 'Jiangsu',
    35. children: [
    36. {
    37. value: 'nanjing',
    38. label: 'Nanjing',
    39. children: [
    40. {
    41. value: 'zhonghuamen',
    42. label: 'Zhong Hua Men',
    43. isLeaf: true
    44. }
    45. ]
    46. }
    47. ]
    48. }
    49. ];
    50. @Component({
    51. selector: 'nz-demo-cascader-change-on-function',
    52. template: `
    53. <nz-cascader
    54. [nzChangeOn]="validate"
    55. [nzOptions]="nzOptions"
    56. [(ngModel)]="values"
    57. (ngModelChange)="onChanges($event)"
    58. >
    59. </nz-cascader>
    60. `,
    61. styles: [
    62. `
    63. .ant-cascader-picker {
    64. width: 300px;
    65. }
    66. `
    67. ]
    68. })
    69. export class NzDemoCascaderChangeOnFunctionComponent {
    70. nzOptions = options;
    71. values: any[] | null = null;
    72. onChanges(values: any): void {
    73. console.log(values, this.values);
    74. }
    75. validate(option: any, _index: number): boolean {
    76. const value = option.value;
    77. return ['hangzhou', 'xihu', 'nanjing', 'zhonghuamen'].indexOf(value) >= 0;
    78. }
    79. }

    Cascader级联选择 - 图7

    搜索

    可以直接搜索选项并选择。

    1. // tslint:disable:no-any
    2. import { Component, OnInit } from '@angular/core';
    3. const options = [
    4. {
    5. value: 'zhejiang',
    6. label: 'Zhejiang',
    7. children: [
    8. {
    9. value: 'hangzhou',
    10. label: 'Hangzhou',
    11. children: [
    12. {
    13. value: 'xihu',
    14. label: 'West Lake',
    15. isLeaf: true
    16. }
    17. ]
    18. },
    19. {
    20. value: 'ningbo',
    21. label: 'Ningbo',
    22. isLeaf: true,
    23. disabled: true
    24. }
    25. ]
    26. },
    27. {
    28. value: 'jiangsu',
    29. label: 'Jiangsu',
    30. children: [
    31. {
    32. value: 'nanjing',
    33. label: 'Nanjing',
    34. children: [
    35. {
    36. value: 'zhonghuamen',
    37. label: 'Zhong Hua Men',
    38. isLeaf: true
    39. }
    40. ]
    41. }
    42. ]
    43. }
    44. ];
    45. const otherOptions = [
    46. {
    47. value: 'fujian',
    48. label: 'Fujian',
    49. children: [
    50. {
    51. value: 'xiamen',
    52. label: 'Xiamen',
    53. children: [
    54. {
    55. value: 'Kulangsu',
    56. label: 'Kulangsu',
    57. isLeaf: true
    58. }
    59. ]
    60. }
    61. ]
    62. },
    63. {
    64. value: 'guangxi',
    65. label: 'Guangxi',
    66. children: [
    67. {
    68. value: 'guilin',
    69. label: 'Guilin',
    70. children: [
    71. {
    72. value: 'Lijiang',
    73. label: 'Li Jiang River',
    74. isLeaf: true
    75. }
    76. ]
    77. }
    78. ]
    79. }
    80. ];
    81. @Component({
    82. selector: 'nz-demo-cascader-search',
    83. template: `
    84. <nz-cascader [nzOptions]="nzOptions" [(ngModel)]="values" [nzShowSearch]="true" (ngModelChange)="onChanges($event)">
    85. </nz-cascader>
    86. &nbsp;
    87. <a href="javascript:;" (click)="changeNzOptions()" class="change-options">
    88. Change Options
    89. </a>
    90. `,
    91. styles: [
    92. `
    93. .ant-cascader-picker {
    94. width: 300px;
    95. }
    96. .change-options {
    97. display: inline-block;
    98. font-size: 12px;
    99. margin-top: 8px;
    100. }
    101. `
    102. ]
    103. })
    104. export class NzDemoCascaderSearchComponent implements OnInit {
    105. nzOptions: any = null;
    106. values: any[] | null = null;
    107. ngOnInit(): void {
    108. setTimeout(() => {
    109. this.nzOptions = options;
    110. }, 100);
    111. }
    112. changeNzOptions(): void {
    113. if (this.nzOptions === options) {
    114. this.nzOptions = otherOptions;
    115. } else {
    116. this.nzOptions = options;
    117. }
    118. }
    119. onChanges(values: any): void {
    120. console.log(values, this.values);
    121. }
    122. }

    Cascader级联选择 - 图8

    默认值与延迟加载

    默认值通过数组的方式指定,但nzOptions没有赋值,通过nzLoadData函数延迟加载。

    1. // tslint:disable:no-any
    2. import { Component } from '@angular/core';
    3. const provinces = [
    4. {
    5. value: 'zhejiang',
    6. label: 'Zhejiang'
    7. },
    8. {
    9. value: 'jiangsu',
    10. label: 'Jiangsu'
    11. }
    12. ];
    13. const cities: { [key: string]: Array<{ value: string; label: string; isLeaf?: boolean }> } = {
    14. zhejiang: [
    15. {
    16. value: 'hangzhou',
    17. label: 'Hangzhou'
    18. },
    19. {
    20. value: 'ningbo',
    21. label: 'Ningbo',
    22. isLeaf: true
    23. }
    24. ],
    25. jiangsu: [
    26. {
    27. value: 'nanjing',
    28. label: 'Nanjing'
    29. }
    30. ]
    31. };
    32. const scenicspots: { [key: string]: Array<{ value: string; label: string; isLeaf?: boolean }> } = {
    33. hangzhou: [
    34. {
    35. value: 'xihu',
    36. label: 'West Lake',
    37. isLeaf: true
    38. }
    39. ],
    40. nanjing: [
    41. {
    42. value: 'zhonghuamen',
    43. label: 'Zhong Hua Men',
    44. isLeaf: true
    45. }
    46. ]
    47. };
    48. @Component({
    49. selector: 'nz-demo-cascader-default-value-and-lazyload',
    50. template: `
    51. <nz-cascader [(ngModel)]="values" [nzLoadData]="loadData" (ngModelChange)="onChanges($event)"> </nz-cascader>
    52. `,
    53. styles: [
    54. `
    55. .ant-cascader-picker {
    56. width: 300px;
    57. }
    58. `
    59. ]
    60. })
    61. export class NzDemoCascaderDefaultValueAndLazyloadComponent {
    62. values: any[] = ['zhejiang', 'hangzhou', 'xihu'];
    63. onChanges(values: any): void {
    64. console.log(values, this.values);
    65. }
    66. /** load data async execute by `nzLoadData` method */
    67. loadData(node: any, index: number): PromiseLike<any> {
    68. return new Promise(resolve => {
    69. setTimeout(() => {
    70. if (index < 0) {
    71. // if index less than 0 it is root node
    72. node.children = provinces;
    73. } else if (index === 0) {
    74. node.children = cities[node.value];
    75. } else {
    76. node.children = scenicspots[node.value];
    77. }
    78. resolve();
    79. }, 1000);
    80. });
    81. }
    82. }

    Cascader级联选择 - 图9

    自定义字段名

    自定义字段名。

    1. // tslint:disable:no-any
    2. import { Component } from '@angular/core';
    3. const options = [
    4. {
    5. code: 'zhejiang',
    6. name: 'Zhejiang',
    7. children: [
    8. {
    9. code: 'hangzhou',
    10. name: 'Hangzhou',
    11. children: [
    12. {
    13. code: 'xihu',
    14. name: 'West Lake',
    15. isLeaf: true
    16. }
    17. ]
    18. },
    19. {
    20. code: 'ningbo',
    21. name: 'Ningbo',
    22. children: [
    23. {
    24. code: 'dongqianlake',
    25. name: 'Dongqian Lake',
    26. isLeaf: true
    27. }
    28. ]
    29. }
    30. ]
    31. },
    32. {
    33. code: 'jiangsu',
    34. name: 'Jiangsu',
    35. children: [
    36. {
    37. code: 'nanjing',
    38. name: 'Nanjing',
    39. children: [
    40. {
    41. code: 'zhonghuamen',
    42. name: 'Zhong Hua Men',
    43. isLeaf: true
    44. }
    45. ]
    46. }
    47. ]
    48. }
    49. ];
    50. @Component({
    51. selector: 'nz-demo-cascader-custom-field-names',
    52. template: `
    53. <nz-cascader
    54. [nzChangeOn]="validate"
    55. [nzOptions]="nzOptions"
    56. [nzLabelProperty]="'name'"
    57. [nzValueProperty]="'code'"
    58. [nzShowSearch]="true"
    59. [(ngModel)]="values"
    60. (ngModelChange)="onChanges($event)"
    61. >
    62. </nz-cascader>
    63. `,
    64. styles: [
    65. `
    66. .ant-cascader-picker {
    67. width: 300px;
    68. }
    69. `
    70. ]
    71. })
    72. export class NzDemoCascaderCustomFieldNamesComponent {
    73. nzOptions = options;
    74. values: any[] | null = null;
    75. onChanges(values: any): void {
    76. console.log(values, this.values);
    77. }
    78. validate(option: any, _index: number): boolean {
    79. const value = option.value;
    80. return ['hangzhou', 'xihu', 'nanjing', 'zhonghuamen'].indexOf(value) >= 0;
    81. }
    82. }

    Cascader级联选择 - 图10

    默认值

    默认值通过数组的方式指定。

    1. // tslint:disable:no-any
    2. import { Component } from '@angular/core';
    3. const options = [
    4. {
    5. value: 'zhejiang',
    6. label: 'Zhejiang',
    7. children: [
    8. {
    9. value: 'hangzhou',
    10. label: 'Hangzhou',
    11. children: [
    12. {
    13. value: 'xihu',
    14. label: 'West Lake',
    15. isLeaf: true
    16. }
    17. ]
    18. },
    19. {
    20. value: 'ningbo',
    21. label: 'Ningbo',
    22. isLeaf: true
    23. }
    24. ]
    25. },
    26. {
    27. value: 'jiangsu',
    28. label: 'Jiangsu',
    29. children: [
    30. {
    31. value: 'nanjing',
    32. label: 'Nanjing',
    33. children: [
    34. {
    35. value: 'zhonghuamen',
    36. label: 'Zhong Hua Men',
    37. isLeaf: true
    38. }
    39. ]
    40. }
    41. ]
    42. }
    43. ];
    44. @Component({
    45. selector: 'nz-demo-cascader-default-value',
    46. template: `
    47. <nz-cascader [nzOptions]="nzOptions" [(ngModel)]="values" (ngModelChange)="onChanges($event)"> </nz-cascader>
    48. `,
    49. styles: [
    50. `
    51. .ant-cascader-picker {
    52. width: 300px;
    53. }
    54. `
    55. ]
    56. })
    57. export class NzDemoCascaderDefaultValueComponent {
    58. nzOptions = options;
    59. values: any[] = ['zhejiang', 'hangzhou', 'xihu'];
    60. /* // or like this:
    61. values: any[] = [{
    62. value: 'zhejiang',
    63. label: 'Zhejiang'
    64. }, {
    65. value: 'hangzhou',
    66. label: 'Hangzhou'
    67. }, {
    68. value: 'xihu',
    69. label: 'West Lake'
    70. }]; */
    71. onChanges(values: any): void {
    72. console.log(values, this.values);
    73. }
    74. }

    Cascader级联选择 - 图11

    移入展开

    通过移入展开下级菜单,点击完成选择。

    1. // tslint:disable:no-any
    2. import { Component } from '@angular/core';
    3. const options = [
    4. {
    5. value: 'zhejiang',
    6. label: 'Zhejiang',
    7. children: [
    8. {
    9. value: 'hangzhou',
    10. label: 'Hangzhou',
    11. children: [
    12. {
    13. value: 'xihu',
    14. label: 'West Lake',
    15. isLeaf: true
    16. }
    17. ]
    18. },
    19. {
    20. value: 'ningbo',
    21. label: 'Ningbo',
    22. isLeaf: true
    23. }
    24. ]
    25. },
    26. {
    27. value: 'jiangsu',
    28. label: 'Jiangsu',
    29. children: [
    30. {
    31. value: 'nanjing',
    32. label: 'Nanjing',
    33. children: [
    34. {
    35. value: 'zhonghuamen',
    36. label: 'Zhong Hua Men',
    37. isLeaf: true
    38. }
    39. ]
    40. }
    41. ]
    42. }
    43. ];
    44. @Component({
    45. selector: 'nz-demo-cascader-hover',
    46. template: `
    47. <nz-cascader
    48. [nzExpandTrigger]="'hover'"
    49. [nzOptions]="nzOptions"
    50. [(ngModel)]="values"
    51. (ngModelChange)="onChanges($event)"
    52. >
    53. </nz-cascader>
    54. `,
    55. styles: [
    56. `
    57. .ant-cascader-picker {
    58. width: 300px;
    59. }
    60. `
    61. ]
    62. })
    63. export class NzDemoCascaderHoverComponent {
    64. nzOptions = options;
    65. values: any[] | null = null;
    66. onChanges(values: any): void {
    67. console.log(values, this.values);
    68. }
    69. }

    Cascader级联选择 - 图12

    选择即改变

    这种交互允许只选中父级选项。

    1. // tslint:disable:no-any
    2. import { Component } from '@angular/core';
    3. const options = [
    4. {
    5. value: 'zhejiang',
    6. label: 'Zhejiang',
    7. children: [
    8. {
    9. value: 'hangzhou',
    10. label: 'Hangzhou',
    11. children: [
    12. {
    13. value: 'xihu',
    14. label: 'West Lake',
    15. isLeaf: true
    16. }
    17. ]
    18. },
    19. {
    20. value: 'ningbo',
    21. label: 'Ningbo',
    22. isLeaf: true
    23. }
    24. ]
    25. },
    26. {
    27. value: 'jiangsu',
    28. label: 'Jiangsu',
    29. children: [
    30. {
    31. value: 'nanjing',
    32. label: 'Nanjing',
    33. children: [
    34. {
    35. value: 'zhonghuamen',
    36. label: 'Zhong Hua Men',
    37. isLeaf: true
    38. }
    39. ]
    40. }
    41. ]
    42. }
    43. ];
    44. @Component({
    45. selector: 'nz-demo-cascader-change-on-select',
    46. template: `
    47. <nz-cascader nzChangeOnSelect [nzOptions]="nzOptions" [(ngModel)]="values" (ngModelChange)="onChanges($event)">
    48. </nz-cascader>
    49. `,
    50. styles: [
    51. `
    52. .ant-cascader-picker {
    53. width: 300px;
    54. }
    55. `
    56. ]
    57. })
    58. export class NzDemoCascaderChangeOnSelectComponent {
    59. nzOptions = options;
    60. values: any[] | null = null;
    61. onChanges(values: any): void {
    62. console.log(values, this.values);
    63. }
    64. }

    Cascader级联选择 - 图13

    自定义已选项

    例如给最后一项加上邮编链接。

    1. // tslint:disable:no-any
    2. import { Component } from '@angular/core';
    3. const options = [
    4. {
    5. value: 'zhejiang',
    6. label: 'Zhejiang',
    7. children: [
    8. {
    9. value: 'hangzhou',
    10. label: 'Hangzhou',
    11. children: [
    12. {
    13. value: 'xihu',
    14. label: 'West Lake',
    15. code: 752100,
    16. isLeaf: true
    17. }
    18. ]
    19. },
    20. {
    21. value: 'ningbo',
    22. label: 'Ningbo',
    23. code: '315000',
    24. isLeaf: true
    25. }
    26. ]
    27. },
    28. {
    29. value: 'jiangsu',
    30. label: 'Jiangsu',
    31. children: [
    32. {
    33. value: 'nanjing',
    34. label: 'Nanjing',
    35. children: [
    36. {
    37. value: 'zhonghuamen',
    38. label: 'Zhong Hua Men',
    39. code: 453400,
    40. isLeaf: true
    41. }
    42. ]
    43. }
    44. ]
    45. }
    46. ];
    47. @Component({
    48. selector: 'nz-demo-cascader-custom-render',
    49. template: `
    50. <nz-cascader
    51. [nzLabelRender]="renderTpl"
    52. [nzOptions]="nzOptions"
    53. [(ngModel)]="values"
    54. (ngModelChange)="onChanges($event)"
    55. >
    56. </nz-cascader>
    57. <ng-template #renderTpl let-labels="labels" let-selectedOptions="selectedOptions">
    58. <ng-container *ngFor="let label of labels; let i = index; let isLast = last">
    59. <span *ngIf="!isLast">{{ label }} / </span>
    60. <span *ngIf="isLast">
    61. {{ label }} (<a href="javascript:;" (click)="handleAreaClick($event, label, selectedOptions[i])">
    62. {{ selectedOptions[i].code }} </a
    63. >)
    64. </span>
    65. </ng-container>
    66. </ng-template>
    67. `,
    68. styles: [
    69. `
    70. .ant-cascader-picker {
    71. width: 300px;
    72. }
    73. `
    74. ]
    75. })
    76. export class NzDemoCascaderCustomRenderComponent {
    77. nzOptions = options;
    78. values: any[] | null = null;
    79. onChanges(values: any): void {
    80. console.log(values, this.values);
    81. }
    82. handleAreaClick(e: Event, label: string, option: any): void {
    83. e.preventDefault();
    84. e.stopPropagation();
    85. console.log('clicked "', label, '"', option);
    86. }
    87. }

    Cascader级联选择 - 图14

    动态加载选项

    使用 nzLoadData 实现动态加载选项。

    1. // tslint:disable:no-any
    2. import { Component } from '@angular/core';
    3. const provinces = [
    4. {
    5. value: 'zhejiang',
    6. label: 'Zhejiang'
    7. },
    8. {
    9. value: 'jiangsu',
    10. label: 'Jiangsu'
    11. }
    12. ];
    13. const cities: { [key: string]: Array<{ value: string; label: string; isLeaf?: boolean }> } = {
    14. zhejiang: [
    15. {
    16. value: 'hangzhou',
    17. label: 'Hangzhou'
    18. },
    19. {
    20. value: 'ningbo',
    21. label: 'Ningbo',
    22. isLeaf: true
    23. }
    24. ],
    25. jiangsu: [
    26. {
    27. value: 'nanjing',
    28. label: 'Nanjing'
    29. }
    30. ]
    31. };
    32. const scenicspots: { [key: string]: Array<{ value: string; label: string; isLeaf?: boolean }> } = {
    33. hangzhou: [
    34. {
    35. value: 'xihu',
    36. label: 'West Lake',
    37. isLeaf: true
    38. }
    39. ],
    40. nanjing: [
    41. {
    42. value: 'zhonghuamen',
    43. label: 'Zhong Hua Men',
    44. isLeaf: true
    45. }
    46. ]
    47. };
    48. @Component({
    49. selector: 'nz-demo-cascader-lazy',
    50. template: `
    51. <nz-cascader [(ngModel)]="values" [nzLoadData]="loadData" (ngModelChange)="onChanges($event)"> </nz-cascader>
    52. `,
    53. styles: [
    54. `
    55. .ant-cascader-picker {
    56. width: 300px;
    57. }
    58. `
    59. ]
    60. })
    61. export class NzDemoCascaderLazyComponent {
    62. values: any[] | null = null;
    63. onChanges(values: any): void {
    64. console.log(values);
    65. }
    66. /** load data async execute by `nzLoadData` method */
    67. loadData(node: any, index: number): PromiseLike<any> {
    68. return new Promise(resolve => {
    69. setTimeout(() => {
    70. if (index < 0) {
    71. // if index less than 0 it is root node
    72. node.children = provinces;
    73. } else if (index === 0) {
    74. node.children = cities[node.value];
    75. } else {
    76. node.children = scenicspots[node.value];
    77. }
    78. resolve();
    79. }, 1000);
    80. });
    81. }
    82. }

    Cascader级联选择 - 图15

    模态窗口

    在模态窗口中使用级联控件。

    1. // tslint:disable:no-any
    2. import { Component } from '@angular/core';
    3. const options = [
    4. {
    5. value: 'zhejiang',
    6. label: 'Zhejiang',
    7. children: [
    8. {
    9. value: 'hangzhou',
    10. label: 'Hangzhou',
    11. children: [
    12. {
    13. value: 'xihu',
    14. label: 'West Lake',
    15. isLeaf: true
    16. }
    17. ]
    18. },
    19. {
    20. value: 'ningbo',
    21. label: 'Ningbo',
    22. isLeaf: true
    23. }
    24. ]
    25. },
    26. {
    27. value: 'jiangsu',
    28. label: 'Jiangsu',
    29. children: [
    30. {
    31. value: 'nanjing',
    32. label: 'Nanjing',
    33. children: [
    34. {
    35. value: 'zhonghuamen',
    36. label: 'Zhong Hua Men',
    37. isLeaf: true
    38. }
    39. ]
    40. }
    41. ]
    42. }
    43. ];
    44. @Component({
    45. selector: 'nz-demo-cascader-modal',
    46. template: `
    47. <nz-modal
    48. [(nzVisible)]="isVisible"
    49. nzTitle="Please select"
    50. (nzOnCancel)="handleCancel($event)"
    51. (nzOnOk)="handleOk($event)"
    52. >
    53. <nz-cascader [nzOptions]="nzOptions" [(ngModel)]="values" (ngModelChange)="onChanges($event)"> </nz-cascader>
    54. </nz-modal>
    55. <button nz-button (click)="open()">Open Dialog</button>
    56. `,
    57. styles: [
    58. `
    59. .ant-cascader-picker {
    60. width: 300px;
    61. }
    62. `
    63. ]
    64. })
    65. export class NzDemoCascaderModalComponent {
    66. nzOptions = options;
    67. values: any[] | null = null;
    68. isVisible = false;
    69. onChanges(values: any): void {
    70. console.log(values, this.values);
    71. }
    72. open(): void {
    73. this.isVisible = true;
    74. }
    75. handleOk($event: MouseEvent): void {
    76. console.log('Button ok clicked!', this.values, $event);
    77. this.isVisible = false;
    78. }
    79. handleCancel($event: MouseEvent): void {
    80. console.log('Button cancel clicked!', $event);
    81. this.isVisible = false;
    82. }
    83. }

    Cascader级联选择 - 图16

    鼠标移入触发

    鼠标移入触发显示菜单,移出隐藏菜单。

    1. // tslint:disable:no-any
    2. import { Component } from '@angular/core';
    3. const options = [
    4. {
    5. value: 'zhejiang',
    6. label: 'Zhejiang',
    7. children: [
    8. {
    9. value: 'hangzhou',
    10. label: 'Hangzhou',
    11. children: [
    12. {
    13. value: 'xihu',
    14. label: 'West Lake',
    15. isLeaf: true
    16. }
    17. ]
    18. },
    19. {
    20. value: 'ningbo',
    21. label: 'Ningbo',
    22. isLeaf: true
    23. }
    24. ]
    25. },
    26. {
    27. value: 'jiangsu',
    28. label: 'Jiangsu',
    29. children: [
    30. {
    31. value: 'nanjing',
    32. label: 'Nanjing',
    33. children: [
    34. {
    35. value: 'zhonghuamen',
    36. label: 'Zhong Hua Men',
    37. isLeaf: true
    38. }
    39. ]
    40. }
    41. ]
    42. }
    43. ];
    44. @Component({
    45. selector: 'nz-demo-cascader-trigger-action',
    46. template: `
    47. <nz-cascader
    48. [nzTriggerAction]="'hover'"
    49. [nzExpandTrigger]="'hover'"
    50. [nzOptions]="nzOptions"
    51. [(ngModel)]="values"
    52. (ngModelChange)="onChanges($event)"
    53. >
    54. </nz-cascader>
    55. `,
    56. styles: [
    57. `
    58. .ant-cascader-picker {
    59. width: 300px;
    60. }
    61. `
    62. ]
    63. })
    64. export class NzDemoCascaderTriggerActionComponent {
    65. nzOptions = options;
    66. values: any[] | null = null;
    67. onChanges(values: any): void {
    68. console.log(values, this.values);
    69. }
    70. }

    Cascader级联选择 - 图17

    默认值与异步列表

    默认值通过数组的方式指定,但nzOptions通过异步加载。

    1. // tslint:disable:no-any
    2. import { Component, OnInit } from '@angular/core';
    3. const options = [
    4. {
    5. value: 'zhejiang',
    6. label: 'Zhejiang',
    7. children: [
    8. {
    9. value: 'hangzhou',
    10. label: 'Hangzhou',
    11. children: [
    12. {
    13. value: 'xihu',
    14. label: 'West Lake',
    15. isLeaf: true
    16. }
    17. ]
    18. },
    19. {
    20. value: 'ningbo',
    21. label: 'Ningbo',
    22. isLeaf: true
    23. }
    24. ]
    25. },
    26. {
    27. value: 'jiangsu',
    28. label: 'Jiangsu',
    29. children: [
    30. {
    31. value: 'nanjing',
    32. label: 'Nanjing',
    33. children: [
    34. {
    35. value: 'zhonghuamen',
    36. label: 'Zhong Hua Men',
    37. isLeaf: true
    38. }
    39. ]
    40. }
    41. ]
    42. }
    43. ];
    44. @Component({
    45. selector: 'nz-demo-cascader-default-value-and-asyn-options',
    46. template: `
    47. <nz-cascader [(ngModel)]="values" [nzOptions]="nzOptions" (ngModelChange)="onChanges($event)"> </nz-cascader>
    48. `,
    49. styles: [
    50. `
    51. .ant-cascader-picker {
    52. width: 300px;
    53. }
    54. `
    55. ]
    56. })
    57. export class NzDemoCascaderDefaultValueAndAsynOptionsComponent implements OnInit {
    58. nzOptions: any[] | null = null;
    59. values: any[] = ['zhejiang', 'hangzhou', 'xihu'];
    60. onChanges(values: any): void {
    61. console.log(values, this.values);
    62. }
    63. ngOnInit(): void {
    64. setTimeout(() => {
    65. this.nzOptions = options;
    66. }, 500);
    67. }
    68. }

    API

    1. <nz-cascader [nzOptions]="options" [(ngModel)]="values"></nz-cascader>

    nz-cascadercomponent

    参数说明类型默认值
    [ngModel]指定选中项any[]-
    [nzAllowClear]是否支持清除booleantrue
    [nzAutoFocus]是否自动聚焦,当存在输入框时booleanfalse
    [nzChangeOn]点击父级菜单选项时,可通过该函数判断是否允许值的变化function(option: any, index: number) => boolean-
    [nzChangeOnSelect]当此项为 true 时,点选每级菜单选项值都会发生变化,具体见上面的演示booleanfalse
    [nzColumnClassName]自定义浮层列类名string-
    [nzDisabled]禁用booleanfalse
    [nzExpandTrigger]次级菜单的展开方式,可选 'click' 和 'hover''click' | 'hover''click'
    [nzMenuClassName]自定义浮层类名string-
    [nzMenuStyle]自定义浮层样式object-
    [nzNotFoundContent]当下拉列表为空时显示的内容string | TemplateRef<void>-
    [nzLabelProperty]选项的显示值的属性名string'label'
    [nzLabelRender]选择后展示的渲染模板TemplateRef<any>-
    [nzLoadData]用于动态加载选项。如果提供了ngModel初始值,且未提供nzOptions值,则会立即触发动态加载。(option: any, index?: index) => PromiseLike<any>-
    [nzOptions]可选项数据源object[]-
    [nzPlaceHolder]输入框占位文本string'请选择'
    [nzShowArrow]是否显示箭头booleantrue
    [nzShowInput]显示输入框booleantrue
    [nzShowSearch]是否支持搜索,默认情况下对 label 进行全匹配搜索,不能和 [nzLoadData] 同时使用boolean | NzShowSearchOptionsfalse
    [nzSize]输入框大小,可选 largedefaultsmall'large' | 'small' | 'default''default'
    [nzValueProperty]选项的实际值的属性名string'value'
    (ngModelChange)值发生变化时触发EventEmitter<any[]>-
    (nzClear)清空值时触发EventEmitter<void>-
    (nzVisibleChange)菜单浮层的显示/隐藏EventEmitter<boolean>-
    (nzSelect)选中菜单选项时触发EventEmitter<{option: any, index: number}>-
    (nzSelectionChange)选中菜单选项时触发EventEmitter<any[]>-

    nzShowSearch 为对象时需遵守 NzShowSearchOptions 接口:

    参数说明类型默认值
    filter可选,选择是否保留选项的过滤函数,每级菜单的选项都会被匹配(inputValue: string, path: CascaderOption[]): boolean-
    sorter可选,按照到每个最终选项的路径进行排序,默认按照原始数据的顺序(a: CascaderOption[], b: CascaderOption[], inputValue: string): number-

    方法

    名称描述
    blur()移除焦点
    focus()获取焦点
    closeMenu()隐藏菜单

    注意,如果需要获得中国省市区数据,可以参考 china-division。