2017-06-02 4 views
0

ich ein Problem haben, wenn sie in meiner Anwendung mehrere Provider:Angular mehrere Service-Provider als Array

ERROR Error: No provider for Array! 
at injectionError (VM634 core.umd.js:1238) [angular] 
at noProviderError (VM634 core.umd.js:1276) [angular] 
at ReflectiveInjector_._throwOrNull (VM634 core.umd.js:2777) [angular] 
at ReflectiveInjector_._getByKeyDefault (VM634 core.umd.js:2816) [angular] 
at ReflectiveInjector_._getByKey (VM634 core.umd.js:2748) [angular] 
at ReflectiveInjector_.get (VM634 core.umd.js:2617) [angular] 
at AppModuleInjector.NgModuleInjector.get (VM634 core.umd.js:3585) [angular] 
at resolveDep (VM634 core.umd.js:11046) [angular] 
at createClass (VM634 core.umd.js:10899) [angular] 
at createDirectiveInstance (VM634 core.umd.js:10730) [angular] 
at createViewNodes (VM634 core.umd.js:12093) [angular] 
at createRootView (VM634 core.umd.js:11998) [angular] 
at callWithDebugContext (VM634 core.umd.js:13213) [angular] 
at Object.debugCreateRootView [as createRootView] (VM634 core.umd.js:12673) [angular] 

Mein Code

@Injectable() 
 
abstract class OtherService<O> { 
 
    
 
    protected parentProp: O; 
 

 
    constructor() { 
 
    } 
 

 
} 
 

 
@Injectable() 
 
class OtherServiceImpl extends OtherService<any> { 
 

 
    private prop; 
 

 
    constructor() { 
 
    super(); 
 
    } 
 
} 
 

 
@NgModule({ 
 
}) 
 
class OtherModule { 
 

 
    static forRoot(): OtherModule { 
 
    return { 
 
     ngModule: OtherModule, 
 
     providers: [ 
 
     {provide: OtherService, useFactory:() => new OtherServiceImpl(), multi: true}, 
 
     {provide: OtherService, useFactory:() => new OtherServiceImpl(), multi: true} 
 
     ], 
 
    }; 
 
    } 
 
} 
 

 
@Component({ 
 
    selector: 'app-root', 
 
    template: ` 
 
    <pre>{{services | json}}</pre> 
 
    ` 
 
}) 
 
class AppComponent { 
 
// IF I USE (public services: OtherService<any>) INSTEAD, IT WORKS, IT'S AND ARRAY BUT NOT USABLE AS AN ARRAY TYPE IN MY COMPONENT 
 
    constructor(public services: OtherService<any>[]) { 
 
    } 
 
} 
 

 
@NgModule({ 
 
    declarations: [ 
 
    AppComponent 
 
    ], 
 
    imports: [ 
 
    BrowserModule, 
 
    OtherModule.forRoot() 
 
    ], 
 
    bootstrap: [AppComponent] 
 
}) 
 
class AppModule { 
 
}

Sie können ein funktionierendes Beispiel finden in dieser Kolben: https://plnkr.co/edit/Nui2eFwS3CtT1fYKDpzh?p=preview

Wie Sie sehen, in der AppComponent, wenn ich meine multi Dienste injiziere, funktioniert es nur, wenn ich es nicht als ein Array angeben ... aber es ist ein Array.

von Typoskript, wird diese Eigenschaft als Objekt identifiziert, und ich kann auf sie nicht iterieren ...

Antwort

0

Dies ist eine seltsame Anfrage, und ich würde gerne den Anwendungsfall für das hören, aber ich schaffte es es läuft für dich. Sie haben @Inject() für Dinge wie diese verwenden:

constructor(@Inject(OtherService)public services: OtherService<any>[]) 

plunkr

Verwandte Themen