我有两个组件:组件A和组件B,其中Comp B命名为" filter"是比较A的孩子。
它们基于激活的路由,它们在URL中获取更改并将调用发送到服务器并获取最新的" filterMap"从它。
Component_A.html
<section class="abc">
<filter [filterMap]=[filterMap]></filter>
<div *ngFor="let item of courses">
<!-- code -->
</div>
</section>
Component_A.ts
import { Component, OnInit, OnDestroy } from '@angular/core';
import { Router, ActivatedRoute } from '@angular/router';
import { Subscription } from 'rxjs';
@Component({
selector: 'component-a',
templateUrl: '../template/component-a.html'
})
export class ComponentAComponent implements OnInit, OnDestroy {
constructor(private _activatedRoute: ActivatedRoute,
private _router: Router) { }
ngOnInit() {
this._querySubscription = this._activatedRoute.queryParams
.subscribe(params => {
this.setQueryParams(params);
this._courseService.getData()
.subscribe(res => {
if (res.data) {
this.courses = res.data.courseDTOList;
this.filterMap = res.data.filterMap;
}
});
});
}
}
Component_B.html
<div class="xyz">
<span> Filter Result </span>
<section class="filter-section" *ngFor='let filter of filterData>
<!-- Code -->
</section>
</div>
Component_B.ts
import { Component, Input, Output, EventEmitter, OnInit, AfterViewInit } from "@angular/core";
import { Router, ActivatedRoute } from '@angular/router';
import { Subscription } from 'rxjs';
@Component({
selector: 'filter',
templateUrl: '../template/course-filter.html'
})
export class FilterComponent implements OnInit{
@Input() filterMap: any;
ngOnInit() {
if (this.filterMap[0])
this.filterData = this.filterMap[0];
}
}
问题:
重新加载页面后,两个组件都会初始化并提供所需的输出。
如果更改了URL,则会发送对服务器的调用,并且filterMap来自服务,但Component_B不会再次初始化,并且过滤器屏幕每次都会保留旧数据。
答案 0 :(得分:1)
默认情况下,如果路径参数发生变化但路径本身没有变化,则这是角度重用组件的预期行为。
例如,对于route/:id
这样的路线,如果用户从route/1
导航到route/2
,则角度将重复使用相同的组件。
这是一种默认行为,可以通过实施您自己的RouteReuseStrategy
来覆盖。您可以check this获取有关此方法的更多信息。
在您的情况下,在更改检测期间而不是在init期间在Component B中定义filterMap应该就足够了:
@Component({
selector: 'filter',
templateUrl: '../template/course-filter.html'
})
export class FilterComponent implements OnChanges {
@Input() filterMap: any;
ngOnChanges() {
if (this.filterMap && this.filterMap[0])
this.filterData = this.filterMap[0];
}
}