我有一个服务,我声明我的变量.在我的组件中,我使用此变量将数据放入其中.
服务:
@Injectable()
export class DataService {
public msgs = [];
constructor() { }
}
Run Code Online (Sandbox Code Playgroud)
现在我在我的组件中使用这个变量:
export class MessagesComponent implements OnInit {
constructor(private dataService: DataService){}
ngOnInit() {
this.getData();
}
getData(){
let msgs = [];
if (diffr <= this.geomessage[i].range) {
this.geomessage[i].dist = diffr;
msgs.push(this.geomessage[i]);
//console.log("this message: ", this.geomessage[i]); //DEBUG
}
this.dataService.msgs = msgs;
}
}
Run Code Online (Sandbox Code Playgroud)
我只发布了必要的代码.它this.dataService.msgs充满了消息,这很好.当我到另一个组件this.dataService.msgs的数据仍然存在,但是当我回来的TOT Messagescomponent的this.dataService.msgs是undefined,直到我再次填满它,但我需要在它的数据.有人知道怎么做吗?
谢谢
我在我的主要组件中发出了一个事件:
main.component.ts
this.sharedService.cartData.emit(this.data);
Run Code Online (Sandbox Code Playgroud)
这是我的sharedService.ts
import { Component, Injectable, EventEmitter } from '@angular/core';
export class SharedService {
cartData = new EventEmitter<any>();
}
Run Code Online (Sandbox Code Playgroud)
在我的其他(Sub)组件中,我想访问此值,但不知何故,订阅不起作用:
dashboard.ts
private myData: any;
constructor(private sharedService: SharedService) {
this.sharedService.cartData.subscribe(
(data: any) => myData = data,
error => this.errorGettingData = <any>error,
() => this.aggregateData(this.myData));
}
Run Code Online (Sandbox Code Playgroud)
我错过了什么吗?当我将数据作为Injectable传递时,它工作正常.在一些REST调用之后发生事件(在主组件中).
更新
所以问题是在第一次发射事件之后创建了子组件.我想在这种情况下最好直接将数据注入subcompnent.
我有 5 个模块,我使用EventAggregator模式在模块之间进行通信。在我看来,我的代码变得丑陋,并且在我的项目中使用EventAggregator是糟糕的设计。
模块之间的通信方式有以下三种:
我想了解有关共享服务通信的更多信息。我发现了一篇关于Prism ToolKit 中的 StockTrader 应用程序的文章。
是否有一些在 Prism 中使用共享服务的更轻量级和更清晰的示例,可以使用共享服务在模块之间进行通信?(可下载代码将不胜感激)
angular ×2
c# ×1
components ×1
eventemitter ×1
prism ×1
service ×1
subscription ×1
typescript ×1
variables ×1
wpf ×1