2016-09-02 5 views
7

角1では、多くのコンポーネントがアクセスできる共有状態を格納するサービスとして、ファクトリが頻繁に使用されました。 Angular 2のように、@ Injectable()として注入されるすべてのサービスは毎回作成され、共有状態が失われます。角2 - シングルトンサービス?

ルートモジュールのprovidersメタキーでサービスを登録していますが、依然として一時的なインスタンスがあります。私が持っているもの

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

とモジュールの定義:その後、コンポーネントでそれを呼び出すための

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

} 

@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メタタグやサービス名を宣言することができ過渡インスタンスを取得します。

答えて

関連する問題