如何在Angular 2应用程序模块和decorator之间共享服务实例?
我理解Angular 2服务,如果在根组件中注入一个,那么所有子组件都共享该服务的相同实例 我有一个日志服务,我想在我的装饰程序和应用程序中使用。但是我想重用根组件中的现有服务实例 现在,如果我在日志服务构造函数中放入调试器语句,我的服务将被实例化多次。我正在使用如何在Angular 2应用程序模块和decorator之间共享服务实例?,angular,typescript,Angular,Typescript,我理解Angular 2服务,如果在根组件中注入一个,那么所有子组件都共享该服务的相同实例 我有一个日志服务,我想在我的装饰程序和应用程序中使用。但是我想重用根组件中的现有服务实例 现在,如果我在日志服务构造函数中放入调试器语句,我的服务将被实例化多次。我正在使用ReflectiveInjector,但我认为它正在创建一个新实例,而不是使用全局实例 也许我做错了,或者我缺乏理解。我这样做的原因是,我在日志服务中有一个可观察的流,多个实例创建多个可观察的流 @Injectable() export
ReflectiveInjector
,但我认为它正在创建一个新实例,而不是使用全局实例
也许我做错了,或者我缺乏理解。我这样做的原因是,我在日志服务中有一个可观察的流,多个实例创建多个可观察的流
@Injectable()
export class LoggerService {
private _applicationLog$: ReplaySubject<string>;
get applicationLog$(): Observable<string> {
return this._applicationLog$.asObservable();
}
constructor(private $localStorage: LocalStorageService, private $appSettings: AppSettings) {
this._applicationLog$ = <ReplaySubject<string>>new ReplaySubject();
}
log(s: string){
//log to a file and push into the stream
this._applicationLog$.next(s);
}
}
@Injectable()
导出类日志服务{
private _applicationLog$:ReplaySubject;
获取applicationLog$():可观察{
返回此项。_applicationLog$.asObservable();
}
构造函数(private$localStorage:LocalStorageService,private$appSettings:appSettings){
此._applicationLog$=新的ReplaySubject();
}
日志(s:字符串){
//登录到文件并推入流
此._applicationLog$.next;
}
}
现在这是我的日志装饰器
var injector = ReflectiveInjector.resolveAndCreate([LocalStorageService, AppSettings]);
var service = <LoggerService>injector.resolveAndInstantiate(LoggerService);
var appSettings = <AppSettings>injector.resolveAndInstantiate(AppSettings);
function getTime() {
let now = new Date();
let min = ("00" + now.getMinutes()).substr(-2, 2);
let hours = ("00" + now.getHours()).substr(-2, 2);
return `${hours}:${min}`;
}
function log(message) {
service.log(`[${getTime()}] ${message}`);
}
export function Trace() {
return function (target: any, propertyKey: string, descriptor: PropertyDescriptor) {
if (AppSettings.logSeverity !== LogSeverity.Trace) return;
log(`TRACE ${propertyKey}.enter()`);
};
}
var injector=ReflectiveInjector.resolveAndCreate([LocalStorageService,AppSettings]);
var服务=注入器解析和安装(LoggerService);
var-appSettings=injector.resolveandistantate(appSettings);
函数getTime(){
让我们现在=新日期();
让min=(“00”+now.getMinutes()).substr(-2,2);
设小时=(“00”+now.getHours()).substr(-2,2);
返回`${hours}:${min}`;
}
功能日志(消息){
log(`[${getTime()}]${message}`);
}
导出函数跟踪(){
返回函数(目标:any,propertyKey:string,描述符:PropertyDescriptor){
if(AppSettings.logSeverity!==logSeverity.Trace)返回;
日志(`TRACE${propertyKey}.enter()`);
};
}
现在我有了一个组件来读取日志
@Component({
templateUrl: 'applicationlogs.template.html'
})
export class ApplicationLogsPage implements OnInit {
logs: string[];
private subscription: Observable<string>;
constructor(private navCtrl: NavController, private $loggerService: LoggerService) { }
ngOnInit(){
this.subscription = this.$loggerService.applicationLog$.subscribe((s) => {
this.logs = s.split(/\r\n|\r|\n/g);
});
}
}
@组件({
templateUrl:'applicationlogs.template.html'
})
导出类ApplicationLogsPage实现OnInit{
日志:字符串[];
私人认购:可观察;
构造函数(私有navCtrl:NavController,私有$loggerService:loggerService){}
恩戈尼尼特(){
this.subscription=this.$loggerService.applicationLog$.subscription((s)=>{
this.logs=s.split(/\r\n |\r |\n/g);
});
}
}
你不能。您可以保存对根注入器的引用,类似于此。@estus,这总比什么都没有好。谢谢