-2

我正在尝试跨模块工作 - 我在模块中编写了一个服务

共享服务

import { Injectable } from '@angular/core';
import { Subject }    from 'rxjs';

@Injectable({
  providedIn: 'root'
})
export class SharedService {
private paramsSource = new Subject<any>();
current_params$ = this.paramsSource.asObservable();
set_current_params( params:any) {
  this.paramsSource.next(params);
}
get_current_params(){
  console.log(this.current_params$)// returns {'id':'15'} on console
  return this.current_params$
}

我从一个并行模块调用它,我可以通过构造函数调用服务来设置当前参数。但是,getter 似乎不适用于同一个模块。订阅似乎不起作用。它似乎返回一个可观察的,但我无法订阅它。

我的组件.ts

import { Component, OnDestroy } from '@angular/core';
import { SharedService } from '../../../core/shared/shared.service';
import { Subscription, Observable } from 'rxjs';



@Component({
  selector: '[app-myComponent]',
  templateUrl: './myComponent.component.html',
  styleUrls: ['./myComponent.component.scss']
})
export class MyComponentComponent implements AfterViewInit {
constructor(
    private shared: SharedService
) { }
ngOnInit() {
  this.shared.set_current_params({'id':'15'});
{
ngAfterViewInit() {
   console.log(this.sharedService.get_current_params());//log line 1
   this.shared.get_current_params().subscribe(current_params => {
   console.log('anything'); //log line 2
   console.log(current_params); //log line 3 
})

}

日志第 1 行在第一行返回一个 observable 但是,订阅什么也不返回,日志 2 和 3 是空的。

我尝试从不同的模块进行相同的订阅,getter 也可以。为什么它没有在 getter 中被这个组件拾取?

4

2 回答 2

0

问题是您在订阅之前设置了一个值。如果您将代码从ngOnInit移至ngAfterViewInit并将代码从ngAfterViewInit移至ngOnInit,那么您的订阅将起作用。请参阅StackBlitz 示例。正如我在上面的评论中提到的,如果您需要支持在订阅时获取最新值的能力,即在您订阅之前发出的最后一个值,那么您需要使用BehaviorSubjectReplaySubject而不是 Subject。

于 2019-08-23T11:32:18.597 回答
-1
  1. 在您的共享模块中,您需要将共享服务添加为提供者。
  2. 在包含 MyComponentComponent 的模块中,您需要导入 SharedModule。您应该在 MyComponentComponent 中包含 SharedModule 和 Module 的代码以获得完整的答案
于 2019-08-23T11:03:18.247 回答