Проблема в том, что структурные директивы, такие как *ngSwitch
и *ngFor
, добавляют и удаляют компоненты, относящиеся к их компетенции. Когда компонент удаляется, любые данные, которые они содержат в своих привязках, также будут удалены. Когда элемент добавляется обратно в Dom, поскольку регистр переключателя снова совпадает, компонент снова создается, старый компонент давно отбрасывается.
Поэтому, чтобы переключать эти разделы, вам нужно условно показывать и скрывать элементы вместо использования структурных директив.
Вот пример:
<ion-list [hidden]="segmentTest !== 'B'">
<ion-item>
<ion-label floating>Input A</ion-label>
<ion-input type="number"></ion-input>
</ion-item>
</ion-list>
<ion-list [hidden]="segmentTest !== 'A'">
<ion-item>
<ion-label floating>Input B</ion-label>
<ion-input type="number"></ion-input>
</ion-item>
</ion-list>
Это будет работать, но мне это не нравится, потому что мы должны отрицать все условия, которые могут быть более сложными, и их просто не так ясно читать. Итак, давайте создадим собственную директиву.
import {Directive, ElementRef, Input} from '@angular/core';
@Directive({selector: '[showWhen]'}) export default class {
constructor(elementRef: ElementRef) {
this.ref = elementRef;
}
@Input() set showWhen(value) {
this.ref.nativeElement.hidden = !value;
}
get showWhen() {
return !this.ref.nativeElement.hidden;
}
// intentional framework stupid weak typing defeated.
ref: {nativeElement: Element};
}
Тогда мы могли бы написать
<ion-list [showWhen]="segmentTest === 'A'">
<ion-item>
<ion-label floating>Input A</ion-label>
<ion-input type="number"></ion-input>
</ion-item>
</ion-list>