除了squadwuschel 的回答,这对我来说非常适合使用Angular 8
我已经扩展了具有Select All 功能的 Kendo MultiSelect 组件
在ngOnInit 中,组件尚未渲染,因此您将其视为未定义。所以你必须使用AfterViewInit
multiselect-extended.component.ts
import {
Component,
OnInit,
ViewChild,
Output,
ContentChild,
AfterViewInit,
EventEmitter
} from "@angular/core";
import {
HeaderTemplateDirective,
MultiSelectComponent
} from "@progress/kendo-angular-dropdowns";
@Component({
selector: "app-custom-multselect",
templateUrl: "./custom-multselect.component.html",
styleUrls: ["./custom-multselect.component.css"]
})
export class CustomMultselectComponent implements OnInit, AfterViewInit {
@ViewChild(HeaderTemplateDirective, { static: false })
headerTemplate: HeaderTemplateDirective;
@ContentChild(MultiSelectComponent, { static: false })
multiselect: MultiSelectComponent;
@Output() selectAllEvent: EventEmitter<boolean> = new EventEmitter();
constructor() {}
ngOnInit() {}
ngAfterViewInit() {
console.log(this.multiselect);
this.multiselect.headerTemplate = this.headerTemplate;
}
public toggleSelection(): void {
if (this.multiselect.value.length > 0) {
this.multiselect.reset();
this.selectAllEvent.emit(false);
} else {
this.multiselect.writeValue(this.multiselect.data);
this.multiselect.value = this.multiselect.data.slice();
this.selectAllEvent.emit(true);
}
}
}
请注意,我添加了 selectAllEvent 来更新多选下拉菜单中显示的复选框。
app.component.html
<app-custom-multselect (selectAllEvent)=" selectAllItems($event)">
<kendo-multiselect [data]="listItems" [(ngModel)]="value" [textField]="'text'" [valueField]="'value'"
[autoClose]="false">
<ng-template kendoMultiSelectItemTemplate let-dataItem>
<input type="checkbox" class="k-checkbox"
[checked]="isItemSelected(dataItem.text) || isAllSelected">
<label class="k-checkbox-label">{{ dataItem.text }}</label>
</ng-template>
</kendo-multiselect>
</app-custom-multselect>
app.component.ts
export class AppComponent {
public listItems: Array<{ text: string; value: number }> = [
{ text: "Small", value: 1 },
{ text: "Medium", value: 2 },
{ text: "Large", value: 3 },
{ text: "XL", value: 4 },
{ text: "XXL", value: 5 }
];
public value: any = [];
public isAllSelected: boolean = false;
public isItemSelected(itemText: string): boolean {
return this.value.some(item => item.text === itemText);
}
selectAllItems(isSelectAll) {
if (isSelectAll) {
this.isAllSelected = true;
} else {
this.isAllSelected = false;
}
}
}
您也可以在StackBlitz 上找到演示