【发布时间】:2016-09-19 19:44:31
【问题描述】:
我正在构建一个 Angular 2 应用程序,其搜索表单和结果显示在同一页面上。我已经使用路由来显示结果部分。所以父组件是具有多个字段的搜索表单,子组件从后端获取结果并显示它。
由于搜索条件涉及多个字段,我通过共享服务将搜索条件传达给子组件。
父组件:
@Component({
templateUrl : 'app/search-form.template.html'
})
export class SearchFormComponent {
constructor(private searchService : SearchService,
private router: Router){}
submitSearch(){
this.searchService.setSearchCriteria(this.model);
this.router.navigate(['search-form/search-result']);
}
子组件:
@Component({
templateUrl: 'app/search-result/search-result.template.html'
})
export class SearchResultComponent implements OnInit{
private searchResult = [] ;
constructor(private searchService: SearchService) { }
ngOnInit() {
this.searchService.getSearchResult().subscribe(data => {
this.searchResult = data;
});
}
这里是服务代码:
@Injectable()
export class SearchService{
constructor (private http: Http) {}
setSearchCriteria(searchCriteria : SearchCriteria){
this.searchCriteria = searchCriteria;
}
getSearchResult() : Observable<any> {
let body = JSON.stringify(this.searchCriteria);
let headers = new Headers({'content-type' : 'application/json'});
let options = new RequestOptions({headers : headers});
return this.http.post(this.baseUrl , body, options)
.map((res: Response) => res.json().root || {});
}
使用路由加载父级和子级。这是路由详情
const appRoutes : Routes = [
{
path: '',
redirectTo: '/search-form',
pathMatch: 'full'
},
{
path: 'search-form', component: SearchFormComponent,
children: [
{ path: ''},
{ path: 'search-result', component: SearchResultComponent }
]
}
];
main.html 看起来像这样。此处搜索表单(父级)呈现为“搜索表单”
<nav class="navbar" >
<div class="container-fluid">
<router-outlet></router-outlet>
</div>
</nav>
search-form.template.html sn-p
<form #searchForm="ngForm" class="form-horizontal" (ngSubmit)="submitSearch()">
<!-- form fields -->
<button type="submit" class="btn btn-sm btn-primary pull-right">Submit</button>
<div class="panel panel-primary">
<!-- Search Result here -->
<router-outlet></router-outlet>
</div>
parent 的 submitSearch() 方法在从 parent 提交表单时被调用。它导航到子组件并显示 searchResult。到目前为止,它工作正常。
我想要的是用户应该能够更改屏幕上的搜索条件并再次点击提交按钮。调用 submitSearch() 方法,但子组件中的结果未更新。我认为根本原因是子组件在 ngOnInit 方法中调用服务。显示结果后,因为我在同一页面上,重新点击提交按钮不会再次创建子组件,因此不会刷新数据。
如何在从父组件提交时使用新的 searchResult 重新加载子组件。
【问题讨论】:
-
添加了更多细节以显示导航