Поэтому я использую тип ng2-bootstrap для поля поиска, которое у меня есть. Когда я выбираю возвращаемое значение, я хочу, чтобы панель ниже обновлялась с подробностями, полученными из выбранного элемента.
В моем родительском компоненте у меня есть это:
HTML:
<input [(ngModel)]="asyncSelected"
[typeahead]="dataSource"
(typeaheadLoading)="changeTypeaheadLoading($event)"
(typeaheadNoResults)="changeTypeaheadNoResults($event)"
(typeaheadOnSelect)="onSelectSearchValue($event)"
[typeaheadOptionsLimit]="7"
[typeaheadMinLength]="3"
[typeaheadWaitMs]="500"
[typeaheadOptionField]="'name'"
name="searchField"
class="form-control" style="width: 250px;" placeholder="Search Chip Families">
...
<div class="container-fluid">
<router-outlet></router-outlet>
</div>
Машинопись:
public onSelectSearchValue(e: TypeaheadMatch): void {
this.chipFamilyId = e.item.id;
}
Как получается, что я передаю это значение, возвращаемое из заголовка, моему компоненту, который обрабатывает вызов службы, чтобы найти детали и поместить их в <router-outlet>
? Использование обнаружения изменений, похоже, не сработало.
Мой дочерний компонент выглядит следующим образом:
HTML:
<div class="content" *ngIf='chipFamilies && chipFamilies.length'>
<ol class="breadcrumb">
<li><a [routerLink]="['/home']">Home</a></li>
<li><a [routerLink]="['/chipFamily']">{{chipFamilies.Hierarchy}}</a></li>
<li class="active">{{chipFamilies.Name}}</li>
</ol>
<h2>{{chipFamilies.Hierarchy}}</h2>
...
Машинопись:
export class ChipFamilyComponent implements OnInit, OnChanges {
errorMessage: string;
@Input() chipFamilyId: number = 11223;
chipFamilies: IChipFamily[];
constructor(private _adminService: ChipFamilyService) {
}
ngOnInit(): void {
//Initially load 11223 on load
this._adminService.getChipFamily(this.chipFamilyId).subscribe(
chipFamilies => this.chipFamilies = chipFamilies,
error => this.errorMessage = <any>error
);
}
ngOnChanges(changes:{[propKey: string]: SimpleChange}) {
debugger;
this._adminService.getChipFamily(this.chipFamilyId).subscribe(
chipFamilies => this.chipFamilies = chipFamilies,
error => this.errorMessage = <any>error
);
}
}
@Input()
предназначен для связи между прямыми родительско-дочерними компонентами. В вашем случае у вас есть<router-outlet>
посередине, так что этот тег больше не актуален. Вместо этого вы должны использовать общую службу иSubject
для запуска события изменения в отдельных компонентах. - person Harry Ninh   schedule 16.11.2016