J'utilise @input
pour recevoir une propriété du composant parent afin d'activer une classe CSS dans l'un des éléments du composant enfant.
Je peux recevoir la propriété du parent et aussi activer la classe. Mais cela ne fonctionne qu'une fois. La propriété que je reçois de parent est une donnée booléenne typée et lorsque je règle son statut sur false
à partir du composant enfant, elle ne change pas dans parent.
Plunkr: https://plnkr.co/edit/58xuZ1uzvToPhPtOING2?p=preview
app.ts
import {Component, NgModule} from '@angular/core'
import {BrowserModule} from '@angular/platform-browser'
import { HeaderComponent } from './header';
import { SearchComponent } from './header/search';
@Component({
selector: 'my-app',
template: `
<app-header></app-header>
`,
})
export class App {
name:string;
constructor() {
}
}
@NgModule({
imports: [ BrowserModule ],
declarations: [ App, HeaderComponent, SearchComponent ],
bootstrap: [ App ]
})
export class AppModule {}
header.ts
import { Component, OnInit } from '@angular/core';
@Component({
selector: 'app-header',
template: `<header>
<app-search [getSearchStatus]="isSearchActive"></app-search>
<button (click)="handleSearch()">Open Search</button>
</header>`
})
export class HeaderComponent implements OnInit {
isSearchActive = false;
handleSearch() {
this.isSearchActive = true
console.log(this.isSearchActive)
}
constructor() { }
ngOnInit() { }
}
header/search.ts
import { Component, OnInit, Input } from '@angular/core';
@Component({
selector: 'app-search',
template: `<div id="search" [class.toggled]="getSearchStatus">
search
<button (click)="getSearchStatus = false" class="close">Close Search</button>
</div>`
})
export class SearchComponent implements OnInit {
@Input() getSearchStatus: boolean;
constructor() { }
ngOnInit() {
}
}
S'il vous plaît vérifier le plunker donné ci-dessus. La fonction de recherche ouverte ne fonctionne qu'une fois. Après la fermeture de la recherche, il ne se déclenche plus.
Est-ce que @input
est le cas d'utilisation approprié pour ce scénario? S'il vous plaît aidez-moi à résoudre ce problème. (S'il vous plaît mettre à jour le plunker).
Vous devez utiliser une liaison de données bidirectionnelle.
@Input()
est une liaison de données à sens unique. pour activer la liaison de données bidirectionnelle, vous devez ajouter un @Output()
correspondant à la propriété, avec le suffixe "Modifier"
@Input() getSearchStatus: boolean;
@Output() getSearchStatusChange = new EventEmitter<boolean>();
lorsque vous souhaitez publier la modification apportée à votre propriété sur le parent, vous devez en informer le parent avec:
this.getSearchStatusChange.emit(newValue)
et dans le parent, vous devez utiliser la notation banane dans une boîte pour cette propriété:
[(getSearchStatus)]="myBoundProperty"
vous pouvez également vous lier à la propriété et déclencher un rappel lorsqu'il change dans child:
[getSearchStatus]="myBoundProperty" (getSearchStatusChange)="myCrazyCallback($event)"
voir le plnkr
Une autre approche: utilisez rxjs/BehaviorSubject pour transmettre le statut entre différents composants.
Voici le plunkr .
Je nomme sujet avec le suffixe 'Rxx', le BehaviorSubject pour searchStatus sera donc searchStatusRxx.
searchStatusRxx = new BehaviorSubject(false);
,searchStatusRxx.next(value)
pour changer la dernière valeur.Edité votre code un peu, cela fonctionne et semble plus simple imo. Dis-moi si ça te plait.
Encore une autre façon. Plunkr . Ce que nous voulons, c'est une source unique de vérité. Nous pouvons mettre cela dans l'enfant cette fois.
searchStatus = false
#as
ou quel que soit son nom.#as.searchStatus
et dans enfant this.searchStatus
.