Angular 2 - 单身人士服务?

Ric*_*ahl 7 angular2-di angular

在Angular 1中,我经常使用工厂来提供服务,以存储许多组件可访问的共享状态.看起来在Angular 2中,每次都会创建注入@Injectable()的所有服务,从而失去共享状态.

我在根模块的providers元键上注册'服务,但我仍然得到一个瞬态实例.

是)我有的:

Injectable()
export class ArtistService {
   constructor(private http:Http) {
     // firing on each injection
     console.log("ArtistService ctor");
   }

}
Run Code Online (Sandbox Code Playgroud)

然后在组件中调用它:

@Component({
    selector: 'artist-display',
    templateUrl: './artistDisplay.html',
})
export class ArtistDisplay  {
    constructor(private artistService: ArtistService) {
           // instance is fine but transient
    }
}
Run Code Online (Sandbox Code Playgroud)

以及模块的定义:

@NgModule({
  declarations: [...],
  imports: [BrowserModule, FormsModule, HttpModule,
    RouterModule.forRoot(rootRouterConfig)],
  providers   : [
      ArtistService,

      // make sure you use this for Hash Urls rather than HTML 5 routing
      { provide: LocationStrategy, useClass: HashLocationStrategy },
  ],
  bootstrap: [AppComponent]
})
Run Code Online (Sandbox Code Playgroud)

我怀疑可能有其他方式'注册',ArtistService所以它作为静态实例保持加载?可以通过DI实现,还是需要手动创建静态实例方法?

更新:
原来上面的代码确实有效.我正在寻找错误的地方以及导致数据无法正确缓存的逻辑错误.

上面的代码工作并providers顶级AppModule部分中分配服务是在AppComponent的持续时间内使父引用保持加载的关键.在提供Singleton实例的应用程序的生命周期内有效地保持加载状态.

要获得瞬态实例,您可以在实际组件上声明providers元标记和服务名称,然后在加载/重新加载组件时创建服务.

mic*_*yks 3

你所展示的是正确的方法。它创建将在组件之间共享的单个实例。

https://plnkr.co/edit/FBCa39YC4ZPoy6y8OZQl?p=preview供参考。

import { NgModule }      from '@angular/core';
import { BrowserModule } from '@angular/platform-browser';

import { AppComponent }  from './app.component';
import {service} from './service';
@NgModule({
  imports:      [ BrowserModule ],
  declarations: [ AppComponent],
  providers:[service],

  bootstrap:    [ AppComponent ]
})
export class AppModule { }
Run Code Online (Sandbox Code Playgroud)

  • 在 appmodule 中提供 `providers:[service],` 使其成为单例。如果将它单独注入到不同的组件中,那么组件将拥有自己的实例。因此,为了使其成为单例,您必须将其添加到 appModule 的 ngModule 中,或者您可以创建一个 coremodule(在官方网站上了解更多信息)@Tek (7认同)
  • 嗯...这对我不起作用。每次注入“ArtistDisplayComponent”时都会触发服务构造函数。 (6认同)
  • 好吧,我仍然不知道当你有单个组件时如何显示它是单例的。为了检查它是否是单例,需要两个组件注入相同的服务。 (2认同)