Я воспроизвел простой stackblitz , демонстрирующий проблему, с которой я столкнулся. Проблема в том, что у меня есть родительский компонент, который передает логическое значение дочернему компоненту. Это логическое значение - @Input дочернего компонента. Важно отметить, что родительский компонент использует ChangeDetectionStrategy.OnPu sh. Для дочернего компонента это явно не установлено.
Когда родительский компонент изменяет логическое свойство ввода дочернего компонента в методе subscribe , дочерний компонент изначально не обнаруживает изменения. Всегда требуется 2 щелчка мыши, чтобы дочерний компонент обнаружил изменение.
Однако, когда я изменяю логическое свойство ввода дочернего компонента вне метода подписки, дочерний компонент, который правильно обнаруживает изменение, и все работает должным образом (1 щелчок, чтобы дочерний компонент распознал изменение).
App.Component.ts (Parent Component)
@Component({
selector: 'my-app',
templateUrl: './app.component.html',
styleUrls: [ './app.component.css' ],
changeDetection: ChangeDetectionStrategy.OnPush,
})
export class AppComponent {
constructor(private http: HttpClient) {
}
public isHelloVisible: boolean;
public useHttpGet: boolean;
showHello() {
if (this.useHttpGet) {
this.http.get('https://cors-anywhere.herokuapp.com/https://api.darksky.net/forecast/cc0e3799790b0b34bdeb6fef28c3daf7/17.447409200000003,-78.3724573?units=si').subscribe(data => {
this.isHelloVisible = true;
});
} else {
this.isHelloVisible = true;
}
}
closeHello() {
this.isHelloVisible = false;
}
Child Component ( Hello.component.ts)
@Component({
selector: 'hello',
template: `<div *ngIf="showHello">
Hello
<div (click)="closeHello()">Click me to close Hello</div>
</div>
`,
styles: []
})
export class HelloComponent {
@Input() showHello: boolean;
@Output() close: EventEmitter<any> = new EventEmitter();
ngOnChanges(changes: SimpleChanges): void {
console.log(this.showHello);
}
closeHello() {
this.close.emit(null);
}
если useHttpGet истинно, он не работает, а если false, все работает.
Я понимаю, что могут быть разные способы сделать это или вручную обнаружение изменения триггера, но меня больше интересует, почему это не работает, поскольку для меня это не имеет никакого смысла.
Вероятно, лучший способ увидеть это в действии - это проследить демонстрацию stackblitz.