Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/371.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Angular 角5服务作为单例_Angular_Service_Singleton - Fatal编程技术网

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

我在做Angular 5单件服务。在我看来,我所做的一切都是按照指导方针,不幸的是,我的服务不是单身。每个组件似乎都有自己的服务实例。 我的代码如下所示:

应用程序模块:

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实例,则可能会出现问题