首页 文章

Angular 2 - 没有响应使用Observable服务将对象发送到<router-outlet>组件

提问于
浏览
1

我正在尝试通过 <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 回答

  • 2

    有一个时间问题 . 在 ParentComponentngOnInit() 中的事件是在执行 ChildComponent 的构造函数之前发出的,因此订阅发生得太晚了 .

    BehaviorSubject 记住最后一个事件,并将其传递给新订阅者,因此 ChildComponent 在订阅完成后立即收到事件 . 或者 ReplaySubject 可以使用 . ReplaySubject 不需要初始值 .

相关问题