最好使用 Angular BehaviorSubject 服务并让组件订阅更改事件。我创建了一个简单的 Pokemon Api,它完全符合您的需求。很容易看到源代码中发生了什么。
服务如下
@Injectable()
export class PokemonFilterService {
private pokemonfilterStatus = new PokemonFilter();
private pokemonFilterSource = new BehaviorSubject<PokemonFilter>(this.pokemonfilterStatus);
// this updates the data from the component
change(data: PokemonFilter) : void {
this.pokemonFilterSource.next(data);
}
// this lets the subscribing component know the data has changed
public filterDataHasChanged(): Observable<PokemonFilter> {
return this.pokemonFilterSource.asObservable();
}
}
pokemon-header 页面有这个代码
@Component({
selector: 'app-pokemon-header',
templateUrl: './pokemon-header.component.html',
styleUrls: ['./pokemon-header.component.scss']
})
export class PokemonHeaderComponent implements OnInit {
typeList: Array<PokeTypes>;
pokemonFilter: PokemonFilter;
constructor(private route: ActivatedRoute, private pokemonFilterService: PokemonFilterService) { }
ngOnInit(): void {
// one api call - get the list once and pass it down
// fyi the api call was cached by the resolver
this.typeList = this.route.snapshot.data['typeList'].results as Array<PokeTypes>;
this.typeList = this.typeList.sort((a, b) => (a.name > b.name) ? 1 : -1);
// use this service to check if the filter values changes from detail component (reset)
this.pokemonFilterService.filterDataHasChanged().subscribe((pokemonFilter: PokemonFilter) => {
if (pokemonFilter) {
this.pokemonFilter = pokemonFilter;
}
});
}
filterChanged(): void {
this.pokemonFilterService.change(this.pokemonFilter)
}
}
pokemon-detail 可以订阅和更改数据,并且会通知 header 组件。
ngOnInit(): void {
this.pagingOffset = 0;
this.getPokemons(this.pagingOffset);
// use this service to check if the filter values change (reset)
this.pokemonFilterService.filterDataHasChanged().subscribe((pokemonFilter : PokemonFilter) => {
if (pokemonFilter) {
this.pokemonFilter = pokemonFilter;
}
});
}
总结
在一个组件中更改数据,在另一个组件中订阅数据。组件可以不相关。
在此处查看完整的源代码https://github.com/tfa7