我正在尝试通过 <router-outlet></router-outlet>
从父组件,对象到子组件进行服务传递 . 我使用文档来指导我https://angular.io/docs/ts/latest/cookbook/component-communication.html#!#bidirectional-service,但是当我尝试运行应用程序时,我没有收到任何错误或输出 .
服务代码:
import {Injectable} from '@angular/core';
import {Subject} from 'rxjs';
import {MyObject} from '../models/my-object.model';
@Injectable()
export class ObjectTransferService {
private myObjectSource = new Subject<MyObject>();
objectSource$ = this.myObjectSource.asObservable();
sendMyObject(myObject: MyObject) {
this.myObjectSource.next(myObject);
}
}
父组件:
import {Component} from '@angular/component';
import {MyObject} from '../models/my-object.model';
import {ObjectTransferService} from '../service/object-transfer.service';
@Component({
template: `
<router-outlet></router-outlet>
`,
providers: [ObjectTransferService]
})
export class ParentComponent implements OnInit {
public myObject: MyObject = <MyObject>{ foo: 'bar' };
constructor(private objectTransferService: ObjectTransferService){}
public ngOnInit(): void {
this.objectTransferService.sendMyObject(myObject);
}
}
通过 <router-outlet></router-outlet>
传递的子组件:
import {Component} from '@angular/component';
import {MyObject} from '../models/my-object.model';
import {ObjectTransferService} from '../service/object-transfer.service';
@Component({
...
})
export class ChildComponent {
constructor(private objectTransferService: ObjectTransferService){
objectTransferService.objectSource$.subscribe(
res => console.log('details', res),
err => console.log('err' ,err));.
}
}
更新(已回答)
将新主题<MyObject>()更改为新的BehaviorSubject <MyObject>(<MyObject> {})
我认为这个没有收到回复的原因是我订阅后没有更新主题 . 使用BehaviorSubject可以使用最新值更新观察者,如此处所述,Angular 2 - Behavior Subject vs Observable? .
1 回答
有一个时间问题 . 在
ParentComponent
的ngOnInit()
中的事件是在执行ChildComponent
的构造函数之前发出的,因此订阅发生得太晚了 .BehaviorSubject
记住最后一个事件,并将其传递给新订阅者,因此ChildComponent
在订阅完成后立即收到事件 . 或者ReplaySubject
可以使用 .ReplaySubject
不需要初始值 .