angular - Bruke mat-option OG mat-radio-button i en mat-select eller mat-selection-list
Jeg prøver å lage en «flere-nivå» mat-select, og jeg vil gjerne bruke både avkrysningsbokser og radioknapper.
Et eksempel på hvordan det kan brukes til å sette egenskaper for en bil (forutsatt at en radio bare kan være Digital eller FM):
- [v] Stero
- [v] Radio
- ---(o) Digital
- ---( ) FM
- [ ] Barneseter
- [ ] Bakre kamera
Radioknappene skal kun vises hvis «foreldre»-alternativet er krysset av, i dette tilfellet Radio.
<mat-form-field>
<mat-select [(value)]="viewValue" #multipleSelect (openedChange)="onMultipleChange($event, multipleSelect.selected)" multiple>
<ng-container *ngFor="let property of carProperties">
<!-- If the property does not have any subProperties, display the property. Else display the nested options (subProperties) -->
<mat-option *ngIf="!property.subProperties; else nestedOption" [value]="property.value">
{{property.value}}
</mat-option>
<ng-template #nestedOption>
<mat-checkbox #parentOption>
{{property.value}}
</mat-checkbox>
<ng-container *ngIf="parentOption.checked">
<ng-template #radioOptions>
<mat-radio-group (change)="radioChange($event)"> <!-- Not sure what the ngModel should be here -->
<mat-radio-button *ngFor="let subProperty of property.subProperties" [value]="subProperty.value">
{{subProperty.value}}
</mat-radio-button>
</mat-radio-group>
</ng-template>
</ng-container>
</ng-template>
</ng-container>
</mat-select>
</mat-form-field>
Jeg har laget en løsning, men når jeg velger en radioknapp får jeg denne unntaksfeilen:
"Verdien må være et array i modus for flervalg ved getMatSelectNonArrayValueError (select.es5.js:116) ved MatSelect.push.."
Jeg antar at dette er fordi mat-select ser etter endringer i strukturen sin, der radioknappene er plassert. Hvordan kan jeg strukturere mat-komponentene for å få ønsket oppførsel?
Svar #1
Jeg tror du kan ha gjort dette litt mer komplisert enn nødvendig. I stedet for å bruke en if-else-konstruksjon, kan du bare skjule eller vise avmerkingsboksene når det finnes under-egenskaper. Her er en forenklet versjon som bør fungere:
<mat-form-field>
<mat-select [(value)]="viewValue" #multipleSelect multiple>
<ng-container *ngFor="let property of carProperties">
<mat-option [value]="property.value">
{{ property.value }}
</mat-option>
<div *ngIf="property.subProperties && valueSelected(property.value)">
<mat-radio-group>
<mat-radio-button *ngFor="let subProperty of property.subProperties"
[value]="subProperty.value"
style="display: block; padding: 12px 12px 12px 32px;">
{{ subProperty.value }}
</mat-radio-button>
</mat-radio-group>
</div>
</ng-container>
</mat-select>
</mat-form-field>
Og i .ts-filen:
viewValue: string[] = [ ];
carProperties = [
{ value: 'Stereo' },
{ value: 'Radio',
subProperties: [
{ value: 'Digital' },
{ value: 'FM' }
]
}, { value: 'Child seats' },
{ value: 'Rear camera' }
];
valueSelected(value: string): boolean {
return this.viewValue.indexOf(value) !== -1;
}
