2016-03-27 10 views
2

Ich habe mehrere Module in meiner Angular2-Anwendung, die Dienste und Konfiguration bereitstellen.Angular2 Provider, der von anderen Providern abhängig ist

Jetzt möchte ich die @ngrx/store einschließen, die die verfügbaren Reduzierungen von meinen Modulen sammelt.


Hier ist der Bootstrap-Code:

import {OpaqueToken} from 'angular2/core' 
import {provideStore} from '@ngrx/store' 

export const REDUCER_TOKEN = new OpaqueToken('Reducer'); 

bootstrap(AppComponent, [ 
    provide(REDUCER_TOKEN, { useClass: Module1Reducers, multi: true }), 
    provide(REDUCER_TOKEN, { useClass: Module2Reducers, multi: true }), 
    // old code: provideStore({module1, module2}, {module1:{}, module2:[]}) 
    provideStore(/* INSERT CODE HERE */) 
]); 

Der INSERT CODE HERE Kommentar sollte mit etwas ersetzt werden, die alle REDUCER_TOKEN Anbieter verwendet.

Wie kann ich das erreichen?

+0

Sie sehen 'liefern (REDUCER_TOKEN, ...)'? Dies ist ein Provider, der zusammen mit der @Inject (REDUCER_TOKEN) -Liste verwendet werden kann: MyInterface [] '. Schau mal hier (http://blog.thoughttram.io/angular2/2015/11/23/multi-providers-in-angular-2.html), Abschnitt * Understanding Multi Providers *. –

Antwort

1

Ich sehe keinen Weg, um es direkt an provideStore() zu übergeben.

provideStore erstellt und gibt eine Reihe von Anbietern zurück. Mein Versuch ist es, zunächst die Anbieter hinzufügen provideStore() erstellt und dann in einem zweiten Schritt die REDUCER außer Kraft setzen, die auf REDUCER_TOKEN abhängt: sind

bootstrap(AppComponent, [ 
    provide(REDUCER_TOKEN, { useClass: Module1Reducers, multi: true }), 
    provide(REDUCER_TOKEN, { useClass: Module2Reducers, multi: true }), 
    // add generated providers 
    provideStore(), 
    // override `REDUCER` provider 
    provide(REDUCER, { 
     deps: [REDUCER_TOKEN], 
     useFactory(reducer){ 
     if(typeof reducer === 'function'){ 
      return reducer; 
     } 

     return combineReducers({ 
      "foo":reducer[0].reducerFunction, 
      "bar":reducer[1].reducerFunction 
     }); 
     } 
    }), 
]); 

Wenn mehrere Anbieter für das gleiche Token (oder Typen), ohne multi: true zugegeben, dann nur der zuletzt hinzugefügte wird wirksam.

Gebaut nach dieser provideStore() Implementierung https://github.com/ngrx/store/blob/master/src/ng2.ts#L56

- nicht getestet -

+1

Danke! Ich habe es jetzt getestet und es funktioniert mit ein paar kleinen Änderungen: In 'useFactory (Reducer)' ist der 'Reducer' ein Array:' [Module1, Module2] '. Aber die 'combineReducers' Funktion wird nur Funktionen als Parameter annehmen. Um nette Namen zu bekommen, müssen Sie ein Objekt aus dem 'Reduzierer'-Array erstellen. Am Ende sollte der an "combinateReducers" übergebene Parameter wie folgt aussehen: '{" foo ": reduzierer [0] .reducerFunction," bar ": reduzierer [1] .reducerFunction}' (wo 'foo' und' bar' stehen sind die Geschäftsnamen). '...' sowieso: Du hast es gelöst! Vielen Dank. –

+1

Sieht gut aus, in meinem Code verwende ich eine dynamischere Lösung, wo ich den 'name' und die' reducerFunction' aus dem Modularray bekomme. Wie folgt: 'return combinateReducers (reduzierer.reduce ((o, v) => {o [v.name] = v.reducerFunktion; return o;}, {}));'. Aber dein Code ist auch gut :) –

+0

Großartig. Ich werde es so lassen wie es ist, dein Kommentar wird trotzdem hier bleiben. –

Verwandte Themen