【问题标题】:component can't find provider from lazy-loaded module组件无法从延迟加载的模块中找到提供者
【发布时间】:2017-05-25 15:15:43
【问题描述】:

我有一个延迟加载的模块,它有一个服务和一个组件。

我想在该组件中使用该服务,但我得到:

Error: No provider for EventService!

模块

import { NgModule } from '@angular/core';
import { CommonModule } from '@angular/common';
import { EventRoutingModule } from './event-routing.module';

import { FormsModule } from '@angular/forms';
import { HttpModule } from '@angular/http';
import { EventListModule } from './../event-list/event-list.module';

import { ModuleWithProviders } from '@angular/core';

import { EventComponent } from './event.component';
import { EventService } from './event.service';

@NgModule({
    imports: [
        CommonModule,
        FormsModule,
        HttpModule,
        EventRoutingModule,
        EventListModule
    ],
    declarations: [EventComponent]
})

export class EventModule {

    static forRoot(): ModuleWithProviders {
        return {
            ngModule: EventModule,
            providers: [EventService]
        };
    }

}

组件

import { Component, OnInit } from '@angular/core';
import { EventService } from './event.service';

@Component({
    templateUrl: './event.component.html',
    styleUrls: ['./event.component.scss']
})
export class EventComponent implements OnInit {


    private eventService: EventService;

    constructor(eventService: EventService) {
        this.eventService = eventService;
    }

    ngOnInit() {
        this.eventService.getEvents().subscribe(data => console.log(data), error => console.log(error));
    }

}

服务

import { Injectable } from '@angular/core';
import { Observable } from 'rxjs/Observable';
import { AuthHttp } from 'angular2-jwt';

@Injectable()
export class EventService {
    private static readonly URL = 'http://localhost:3000/api/events';

    constructor(private authHttp: AuthHttp) { }

    public getEvents() {

        return this.authHttp.get(EventService.URL);
    }

}

我在这里查看了一些帖子,但无法从他们那里得到解决方案。

我知道延迟加载模块中的提供程序是模块范围的,延迟加载模块有自己的依赖树。

但是必须可以将提供程序注入到组件中,不是吗?

【问题讨论】:

    标签: javascript angular typescript


    【解决方案1】:

    您需要定义提供服务的方式。

    您可以在模块级别定义它的提供方式:

    @NgModule({
        imports: [
            CommonModule,
            FormsModule,
            HttpModule,
            EventRoutingModule,
            EventListModule
        ],
        declarations: [EventComponent],
        providers: [EventService]
    })
    export class EventModule { ... }
    

    这意味着一个EventService 实例将可用于整个模块。

    或者在组件级别

    @Component({
        templateUrl: './event.component.html',
        styleUrls: ['./event.component.scss'],
        providers [EventService]
    })
    export class EventComponent implements OnInit { ... }
    

    这意味着每个组件实例都可以使用一个EventService 实例。这是由于分层注入器功能。该组件定义了自己的注入器,该注入器可以保存自己的实例,这些实例可供其子级使用。

    [EventService] 等价于[ { provide: EventService, useClass: EventService }]。这意味着用于注入依赖项的键是EventService,并且正在使用EventService 构造函数构造实例。

    【讨论】:

    • 为什么它不能与 forRoot 一起使用?我认为在延迟加载模块的情况下,您应该使用 forRoot?
    • forRoot() 用于在根级别配置路由。 forChildren() 在您将路由配置拆分为每个模块时很好。通常建议每个模块有一个单独的模块来配置路由。配置路由的相应模块将使用forChildren()。另一方面,路由loadChildren 属性可用于在到达路由时异步加载模块。
    • 因此,在您的情况下,您有EventModule,您可以有一个单独的EventRoutingModule 模块,该模块执行forChildren(),以便在加载模块时加载路由配置。
    • 谢谢!!帮了我很多!
    猜你喜欢
    • 2017-07-24
    • 2020-07-08
    • 2018-12-21
    • 1970-01-01
    • 1970-01-01
    • 2018-03-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多