问题
So I made my own lib-input
component with custom styles that looks something like this:
<div class="input">
<mat-form-field appearance="outline">
<input matInput [type]="type" placeholder="{{placeholder}}" [(ngModel)]="input" (input)="onChange()">
<ng-content></ng-content>
</mat-form-field>
</div>
Now I want to use this lib-input
with its custom styles for an input field that uses autocomplete.
Something like this:
<mat-form-field>
<lib-input type="text" matInput [formControl]="myControl" [matAutocomplete]="auto">
</mat-form-field>
<mat-autocomplete #auto="matAutocomplete">
<mat-option *ngFor="let option of options" [value]="option">{{option}}</mat-option>
</mat-autocomplete>
<lib-input [matAutocomplete] ...>
doesn't work though, because Property matAutocomplete is not provided by any applicable directives nor by lib-input element
, which makes sense, since my lib-input
doesn't have matAutocomplete
as Input.
Is there any workaround for this? I don't want to make a separate component that uses <input [matAutocomplete]>
because I would have duplicate code for my custom styles, as well as the functionality my lib-input
field has.
回答1:
You can actually just pass the matAutocomplete through to your custom input. So in your lib-input.component.ts
:
@Input() matAutocomplete: MatAutocomplete;
and then pass this to your <input>
in the lib-input.component.html
. The only downside is, that if you don't always want to use the lib-input
with autocomplete, you kind of end up with a bit of ugly code repetition:
<div class="input">
<mat-form-field appearance="outline">
<input *ngIf="matAutocomplete" matInput [type]="type" placeholder="{{placeholder}}" [(ngModel)]="input" (input)="onChange()" [matAutocomplete]="matAutocomplete">
<input *ngIf="!matAutocomplete" matInput [type]="type" placeholder="{{placeholder}}" [(ngModel)]="input" (input)="onChange()">
<ng-content></ng-content>
</mat-form-field>
</div>
回答2:
The answer from tommueller is fine.
In my case my custom input implemented the ControlValueAccessor Interface and I needed to subscribe to MatAutocomple.optionSelected to trigger the registered onChange.
ngAfterViewInit(): void {
this.matAutocomplete?.optionSelected.subscribe(
(event: MatAutocompleteActivatedEvent) => {
this.onChange(event?.option?.value);
}
);
}
回答3:
try this
in your component create new input property
@Input() matAutocomplete: string;
then pass it to your input , so your input will be like this
<input ..... [matAutocomplete]="matAutocomplete"/>
来源:https://stackoverflow.com/questions/58872590/use-matautocomplete-on-my-custom-input-component