8

在 Angular 1 中,我经常使用工厂服务来存储许多组件可以访问的共享状态。看起来在 Angular 2 中,所有作为 @Injectable() 注入的服务每次都被创建,因此失去了共享状态。

我在根模块的providers元键上“注册”了服务,但我仍然得到一个临时实例。

我有的:

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

}

然后在组件中调用它:

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

以及模块的定义:

@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]
})

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

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

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

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

4

4 回答 4

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 { }
于 2016-09-02T04:44:17.233 回答
3

我还想创建一个在 angular2 中用作提供者的对象,所以我创建了一个@injector。但是如果我们在每个@component 中设置provider 并导入它,那么每个组件使用不同的注入器对象。为了创建单例提供程序,我在父组件中声明了这个提供程序并将其导入到每个组件中,现在它工作正常。 https://angular.io/guide/dependency-injection

于 2017-01-07T20:00:03.177 回答
2

单例服务只能保存在app.module.ts “providers”(数组)中

并且不得放置在任何其他组件或服务提供者(数组)中。

如果这样做正确,那么 angular 2 - 2.4.0 - Singleton 可以完美运行

于 2017-02-28T09:24:32.813 回答
1

好的,让我试着根据我的经验和文档来解释服务是如何工作的。

有3个主要场景:

  • 该服务包含在组件级别的提供者数组中 - 该服务可以注入父级和所有子级。

  • 该服务包含在模块级别的 providers 数组中 - 此模块中的所有内容都知道该服务。

  • 该服务包含在模块级别的提供者数组中 - 此模块中的所有内容都知道该服务,但是如果您在另一个模块的另一个组件中使用该模块中的组件,该模块导入第一个模块,则该组件的服务实例将与众不同。

于 2017-01-10T10:19:52.190 回答