Angular 角5服务作为单例
我在做Angular 5单件服务。在我看来,我所做的一切都是按照指导方针,不幸的是,我的服务不是单身。每个组件似乎都有自己的服务实例。 我的代码如下所示: 应用程序模块:Angular 角5服务作为单例,angular,service,singleton,Angular,Service,Singleton,我在做Angular 5单件服务。在我看来,我所做的一切都是按照指导方针,不幸的是,我的服务不是单身。每个组件似乎都有自己的服务实例。 我的代码如下所示: 应用程序模块: import { StarService } from './star-service/star-service' import { StarSearchComponent } from './star-search/star-search.component' import { StarReportComponent } f
import { StarService } from './star-service/star-service'
import { StarSearchComponent } from './star-search/star-search.component'
import { StarReportComponent } from './star-report/star-report.component';
@NgModule({
imports: [
BrowserModule,
FormsModule,
AppRoutingModule
],
declarations: [
AppComponent,
StarSearchComponent,
StarReportComponent
],
providers: [StarService
],
bootstrap: [AppComponent]
})
export class AppModule {
}
import { Injectable } from '@angular/core';
import { log } from 'util';
@Injectable()
export class StarService {
public Param: string;
constructor() {
this.Param = "Not Set";
console.log("Service Instance created");
}
}
服务:
import { StarService } from './star-service/star-service'
import { StarSearchComponent } from './star-search/star-search.component'
import { StarReportComponent } from './star-report/star-report.component';
@NgModule({
imports: [
BrowserModule,
FormsModule,
AppRoutingModule
],
declarations: [
AppComponent,
StarSearchComponent,
StarReportComponent
],
providers: [StarService
],
bootstrap: [AppComponent]
})
export class AppModule {
}
import { Injectable } from '@angular/core';
import { log } from 'util';
@Injectable()
export class StarService {
public Param: string;
constructor() {
this.Param = "Not Set";
console.log("Service Instance created");
}
}
星级报告组件
import { Component, OnInit } from '@angular/core';
import { StarService } from '../star-service/star-service'
@Component({
selector: 'app-star-report',
templateUrl: '<p>{{getReport}}</p>',
styleUrls: ['./star-report.component.css']
})
export class StarReportComponent implements OnInit {
constructor(private starService: StarService) { }
ngOnInit() {
this.starService.Param = "Report";
}
get getReport(): string
{
return this.starService.Param;
}
}
现在,每次切换组件时,我的控制台都会显示“服务实例已创建”。
此外,每个组件都显示错误的文本。我相信,当StarReportComponent被创建时,它将切换starService.Param=“Report”,并且它将保持在那里。
不幸的是,当调用StarSearchComponent时,它显示默认的“未设置”。为什么?为什么单身汉不在这里工作?
谢谢您需要的是服务中的
静态
属性。否则,它将按预期工作。如果您想使您的服务的属性始终是单例的,请在您的服务中这样声明
export class StarService {
static _param: string;
// use getters and setters to access them from your instantiated service objects from within various components
get Param() { return StarService._param; }
set Param(param: string) { StarService._param = param; }
}
编辑
哦,对不起,请重新阅读您的问题,它的行为与预期相符。因为您有this.Param=“未设置”
在服务的构造函数中,每次在组件之间切换时,它都会强制在组件中再次实例化此单例服务(通过组件中的构造函数参数),从而使服务的构造函数再次调用,从而将参数的值恢复为“未设置”
。有意义吗
编辑-2
回答您的评论,这是由于服务通过其(组件的)构造函数被导入组件
简而言之,像这样注入服务
constructor(private starService: StarService) { }
根据,
提供者是可以创建或提供服务的东西。Angular通过使用new
从类提供者创建服务实例
将在引擎盖下将私人starService
属性分配给
private starService = new StarService();
它将调用服务的构造函数
如果不希望每次注入服务时都发生任何默认操作,则不要在其(服务的)构造函数中执行任何属性分配
而且,每次您通过其路由在组件之间切换时,都会通过调用其构造函数及其已实现的相应组件来创建相应的组件。因此,它也会创建在其构造函数中定义的相应依赖项。希望现在有意义。我一直在努力解决这个问题很长一段时间。我想拥有一个单例,每当我从一个链接路由到另一个链接时,就会重新创建我期望的单例服务。最后的解决方案是更改导航链接:
发件人:
致:
我有类似于示例的延迟加载模块。如果这不能解决您的问题,请告诉我。我已经解决此问题很长时间了,可能可以通过重新创建此问题来提供帮助。我无法用示例代码重现此问题:谢谢,我看到您同时创建了两个组件:。我宁愿通过路由在它们之间切换。这有什么区别吗?我知道静态是如何工作的,但我想问的是为什么StarService不作为singleton注入?谢谢。但是为什么服务构造函数被调用了几次?singleton只创建了一次,不是吗?所以每次切换组件时,我都会得到新的服务实例?这是怎么回事一项工作?这真的没有意义,根据这里的文档,服务应该只创建一次,并将该实例共享给任何请求将其注入的类,这里还“Angular module providers(@NgModule.providers)在应用程序的根注入器中注册。Angular可以在它创建的任何类中注入相应的服务。一旦创建,服务实例将在应用程序的生命周期内存在,Angular会在每个需要它的类中注入这一个服务实例。”——>如果多次使用StarService实例,则可能会出现问题