在Angular中,路由器出口(Router Outlet)是用于在应用中展示路由组件的占位符。当子组件位于路由器出口时,它通常是通过路由配置动态加载的。与这样的子组件通信可以通过以下几种方式实现:
原因:子组件通过路由器动态加载,可能无法直接访问父组件的实例。
解决方法:
// 子组件
@Component({
selector: 'app-child',
template: `<button (click)="sendToParent()">Send to Parent</button>`
})
export class ChildComponent {
@Output() notifyParent = new EventEmitter<string>();
sendToParent() {
this.notifyParent.emit('Hello from child!');
}
}
// 父组件模板
<router-outlet (notifyParent)="receiveFromChild($event)"></router-outlet>
// 父组件类
export class ParentComponent {
receiveFromChild(message: string) {
console.log(message);
}
}
// shared.service.ts
@Injectable({ providedIn: 'root' })
export class SharedService {
private messageSource = new BehaviorSubject<string>('default message');
currentMessage = this.messageSource.asObservable();
changeMessage(message: string) {
this.messageSource.next(message);
}
}
// 子组件
@Component({
selector: 'app-child',
template: `<button (click)="sendToParent()">Send to Parent</button>`
})
export class ChildComponent {
constructor(private sharedService: SharedService) {}
sendToParent() {
this.sharedService.changeMessage('Hello from child!');
}
}
// 父组件
@Component({
selector: 'app-parent',
template: `<router-outlet></router-outlet>`
})
export class ParentComponent implements OnInit {
constructor(private sharedService: SharedService) {}
ngOnInit() {
this.sharedService.currentMessage.subscribe(message => console.log(message));
}
}
通过上述方法,可以有效地解决子组件位于路由器出口时与其通信的问题。
没有搜到相关的沙龙
领取专属 10元无门槛券
手把手带您无忧上云