Angular 角度8:对象通过服务,数据不变

Angular 角度8:对象通过服务,数据不变,angular,typescript,Angular,Typescript,我试图将一些数据从一个组件传递到另一个组件,而不是相关的组件。通过服务似乎很容易做到。不幸的是,它不起作用,我不知道为什么。这是我的服务: data.service.ts 调用此方法后似乎没有任何变化,尤其是此主题。。。当我订阅它时,它的值保持为null(或者我尝试过的一些默认值)。在方法内部,它取适当的值 home.component.ts 正如我所说,它只打印“null”。我甚至还测试了点击订阅-同样的结果。 值得一提的是,当home在content.module中时,header在app模

我试图将一些数据从一个组件传递到另一个组件,而不是相关的组件。通过服务似乎很容易做到。不幸的是,它不起作用,我不知道为什么。这是我的服务:

data.service.ts

调用此方法后似乎没有任何变化,尤其是此主题。。。当我订阅它时,它的值保持为null(或者我尝试过的一些默认值)。在方法内部,它取适当的值

home.component.ts

正如我所说,它只打印“null”。我甚至还测试了点击订阅-同样的结果。 值得一提的是,当home在content.module中时,header在app模块中声明。另外,重要的是,我在DataService的标头中遇到了NullInjection错误问题,我需要添加选项“providedIn”。现在没有错误,但它不工作。同时,ApiService虽然紧挨着它,但在没有它的情况下工作得非常好,只是在app.module中声明为提供者。我认为这些提供者/模块可能有问题,但我不知道如何解决

app.module.ts

编辑 用另一种方法尝试服务和结果是完全一样的

@Injectable({
  providedIn: "root"
})
export class DataService {
  constructor() {}

private _searchData = new BehaviorSubject<CityData>(
    new CityData(null, null, null, null)
 );

 get searchData$(): Observable<CityData> {
   return this._searchData.asObservable();
 }

 set searchData(data: CityData) {
   this._searchData.next(data);
 }
}
@可注入({
提供于:“根”
})
导出类数据服务{
构造函数(){}
private _searchData=新行为主体(
新CityData(null,null,null,null)
);
获取searchData$():可观察{
返回此项。_searchData.asObservable();
}
设置搜索数据(数据:CityData){
这个._searchData.next(数据);
}
}

您书面提出的问题没有提供足够的信息来帮助您解决问题,但最常见的情况是您的两个组件使用不同的服务实例。@NicholasK currentSearchData是可观察的,它不会有.next方法。这里公开的代码看起来是ok-ish.True。我觉得
currentSearchData
没有使用最新的值进行更新,因为它在方法之外只进行了一次评估。
currentSearchData
正在使用
searchData
的值(应该更新)并使其可见,不是吗?如果没有,如何修复@Nicholas K,好吧,我想我应该做一些getter来避免使用
currentSearchData
对吧?我觉得这看起来不错。您需要确保两个组件使用相同的DataService实例。“根目录”中提供的
用于使服务在根目录级别可用,在这种情况下,您不需要将您的服务发送给app.module.ts中的
提供商:[……]
列表
onCityClick(city: CityData) {
   this._data.changeSearchData(city);
}
ngOnInit() {
   this._data.currentSearchData.subscribe(data => {
      console.log(data);
    });
 }
@NgModule({
   declarations: [AppComponent, HeaderComponent],
   imports: [
     BrowserModule,
     HttpClientModule,
     AppRoutingModule,
     ContentModule
   ],
   providers: [ApiService, /*DataService being here not helps*/],
   bootstrap: [AppComponent]
 })
 export class AppModule {}
@Injectable({
  providedIn: "root"
})
export class DataService {
  constructor() {}

private _searchData = new BehaviorSubject<CityData>(
    new CityData(null, null, null, null)
 );

 get searchData$(): Observable<CityData> {
   return this._searchData.asObservable();
 }

 set searchData(data: CityData) {
   this._searchData.next(data);
 }
}