Пользовательский компонент, обертывающий элемент управления выбора материала и реализующий ControlValueAccessor, не может выполнить двухстороннее связывание, но успешно связывает один из способов.
Component.ts
@Component({
selector: 'page-size-select',
templateUrl: 'page-size-select.component.html',
inputs: ['pageSize'],
providers: [{
provide: NG_VALUE_ACCESSOR,
useExisting: PageSizeSelectComponent,
multi: true
}]
})
export class PageSizeSelectComponent implements ControlValueAccessor{
pageSizes = [
{ id: 10, name: '10' },
{ id: 25, name: '25' },
{ id: 50, name: '50' },
{ id: -1, name: 'All' }
];
innerPageSize: number;
constructor() {}
private changed = new Array<(value: number) => void>();
private touched = new Array<() => void>();
get pageSize(): number {
return this.innerPageSize;
}
set pageSize(pageSize: number) {
if (this.innerPageSize !== pageSize) {
this.innerPageSize = pageSize;
this.changed.forEach(f => f(pageSize));
}
}
touch() {
this.touched.forEach(f => f());
}
writeValue(pageSize: number) {
this.innerPageSize = pageSize;
}
registerOnChange(fn: (value: number) => void) {
this.changed.push(fn);
}
registerOnTouched(fn: () => void) {
this.touched.push(fn);
}
}
Шаблон компонента
<mat-form-field>
<mat-select placeholder="Page Size..." [(ngModel)]="pageSize" name="pageSize" role="menu">
<mat-option *ngFor="let opt of pageSizes" [value]="opt.id" role="menuitem">
{{opt.name}}
</mat-option>
</mat-select>
</mat-form-field>
Успешное использование:
<page-size-select [pageSize]="pagination.pageSize" ></page-size-select>
Сбой использования:
<page-size-select ([pageSize])="pagination.pageSize" ></page-size-select>
Когда одностороннее связывание успешно, оно успешно читаетpagination.pageSize
значение в базовый элемент управления select и устанавливает выбранную опцию в это значение.Однако целью является двухсторонняя привязка, но при использовании этого синтаксиса привязка не читает и не записывает в pagination.pageSize
.