2016-07-23 109 views
1

我有这样一个角度组件:RxJS,Angular:无法接收其他方法的订阅结果

它创建一个正常的ReplaySubject。 (见constructor)。 然后一些其他组件通过方法getSubject()获得subject并订阅它。另一个组件通过setValue设置新值。这个值应该被订户接收。但是,这不会发生。它什么也收不到,甚至没有错误。

@Injectable() 
export class BreadcrumbService { 

    subject: ReplaySubject<string>; 

    constructor() { 
     this.subject = new ReplaySubject<string>(); 
     console.log('Step 1: Subject created'); 
    } 

    getSubject(): ReplaySubject<string> { 
     console.log('Step 2: Return subject for subscribing'); 
     return this.subject; 
    } 

    setValue(title: string) { 
     console.log('Step 3: Invoke a new value which should be received in the Subscriber of step 2.'); 
     this.subject.next(title); 
    } 
} 

如果我将订阅放在setValue()之内,它就会按预期工作。

这里是我的组件应该接收订阅:

export class BreadcrumbComponent implements OnInit { 

    constructor(
     private breadcrumbsService: BreadcrumbService 
    ) {} 

    ngOnInit() { 
     this.breadcrumbsService.getSubject() 
      .subscribe(
       success => { 
        console.log(success); // is never called 
       }, 
       error => { 
        console.log(error); // is never called 
       } 
      ); 
    } 
} 

我的用户如何获得这个价值?

+0

你检查了@Gunter的说法吗?除了一切应该没有任何错误的工作。 – micronyks

回答

0

我还没有看到一个错误,但 我假设你不止一次提供BreadcrumbService
Angular2为每个提供者维护一个实例。如果您提供多次,则会有多个实例。我假设调用setValue的实例与BreadcrumbComponent得到的实例不同。

如果您希望共享实例在公共父级(例如根组件)上提供共享实例。

+1

感谢您的回答!你是绝对正确的。我提供了两次'BreadcrumbService'。 –

0

请尝试使用Observables来代替。

@Injectable() 
export class BreadcrumbService { 

    subject: Observables<string>; 

    constructor() { 
     this.subject = new Observables<string>(); 
     console.log('Step 1: Subject created'); 
    } 

    getSubject(): Observables<string> { 
     console.log('Step 2: Return subject for subscribing'); 
     return this.subject; 
    } 

    setValue(title: string) { 
     console.log('Step 3: Invoke a new value which should be received in the Subscriber of step 2.'); 
     this.subject.emit(title); 
    } 
}