使用 Angular 9 和 Material 设计的可重用输入组件

Posted

技术标签:

【中文标题】使用 Angular 9 和 Material 设计的可重用输入组件【英文标题】:Reusable input components using Angular 9 and Material design 【发布时间】:2020-07-31 04:44:21 【问题描述】:

我正在尝试使用 Angular 9 和材料设计创建一个可重用的输入组件。类似于下图。

TextboxComponent.html

<mat-form-field appearance="fill">
    <mat-label>Input</mat-label>
    <input matInput formControlName = imeta.formControlName>
</mat-form-field>

TextboxComponent.ts

@Component(
   selector: 'app-textbox',
   templateUrl: './textbox.component.html',
   styleUrls: ['./textbox.component.scss']
  )
export class TextboxComponent implements OnInit 
  @Input()imeta : IMeta
  constructor()  
  ngOnInit(): void 


export class IMeta 
    component: ComponentType;
    formControlName : string = null;


export enum ComponentType 
    TextBox = 0,
    TextArea = 1,
    RadioButton = 2,
    Checkbox = 3,
    Select = 4

这是一个可配置的组件,就像一座桥梁。

reactive-base-inputs.component.html

<ng-container [ngSwitch]="imeta.component">
    <ng-template [ngSwitchCase]="componentType.TextBox">
        <app-textbox [imeta]="imeta"></app-textbox>
    </ng-template>
</ng-container>

@Component(
  selector: 'reactive-inputs',
  templateUrl: './reactive-base-inputs.component.html',
  styleUrls: ['./reactive-base-inputs.component.scss']
)
export class ReactiveBaseInputsComponent implements OnInit 
  @Input() imeta : IMeta;
  componentType = ComponentType
  constructor()  

  ngOnInit(): void 

这是我使用输入组件的地方。

<form [formGroup]="form" (ngSubmit)="onSubmit()">
  <reactive-inputs [imeta]="configuration"></reactive-inputs>
</form>

我遇到了 formControlName 获取和设置的问题,我不知道如何设置 formControlName 并从父组件访问控件。

【问题讨论】:

【参考方案1】:

我有同样的问题,在搜索时我发现了 2 篇对我有很大帮助的文章。我设法创建了可重用的 Material 组件。

https://inglkruiz.github.io/angular-material-reusable-autocomplete/

https://ritchiejacobs.be/angular-custom-form-component

创建可重用组件时的重点是从使用它的组件访问可重用组件的值。这可以通过 ControlValueAccessor 接口完成。

希望对您有所帮助!

【讨论】:

试试这个 repo github.com/anandjaisy/Angular-Dynamic-Form-Builder

以上是关于使用 Angular 9 和 Material 设计的可重用输入组件的主要内容,如果未能解决你的问题,请参考以下文章

AngularCLI 和 Angular Material(原理图)错误:无法解析集合“@angular/material”

Angular Material Datepicker:如何过滤以便只允许数组中的日期?

Angular 9:无法更改或修改 HTTP 标头

如何有效地使用 Angular Material 自定义调色板颜色 Angular Material

如何使用 Angular Material 构建 Ivy?

如何使用 Angular-Material 获得全高侧导航