【问题标题】:No provider for service in pipe管道中没有服务提供商
【发布时间】:2017-09-22 12:14:11
【问题描述】:

我有一个自定义管道和一个指令,我想在它们之间共享一些数据。我创建了一个服务,应该处理这个。 我收到以下错误:

错误:没有 MyService 的提供者

代码如下:

@Injectable()
export class MyService {
    private data: any;
    get Data():any {
        return this.data;
    }
    set Data(d: any) {
        this.data = d;
    } 
}

指令应该提供服务:

@Directive({
     selector: '[my-directive]',
     providers: [MyService],
})
export class MyDirective {
    constructor(private serv: MyService) {}
}

当在同一个组件上使用时,管道也应该获得服务:

@Pipe({
    name: 'myPipe'
})
export class MyPipe {
    constructor(private serv: MyService) {}
    transform(value: any) {
        return value + 'foo';
    }
}

这用于例如这样的输入:

<input [value]="text | myPipe" my-directive />

在我阅读了 DI 上的 angular2 文档并搜索了这个主题后,我找不到任何我做错的事情。据我所知,这应该有效。任何想法为什么不?

ps:在 Ionic2 中使用 Angular 2.x

【问题讨论】:

    标签: angular dependency-injection angular2-services angular2-directives angular2-di


    【解决方案1】:

    尝试将 providers 数组添加到具有此指令和管道的组件中。我认为它应该有效。

    【讨论】:

    • 不幸的是我不能这样做,因为我正在尝试构建一个其他人将要使用的第三方指令。所以我无权访问将要使用该指令的组件。
    • 在这种情况下,您需要将提供程序添加到 MyModule.forRoot 中的模块定义中。
    【解决方案2】:

    您可以在 ngModule.providers 中声明您的服务,然后在您想使用它时注入您的构造函数。如果您的服务是另一个模块的一部分,那么您必须导入该模块。一旦你在提供者中获得了服务,以后你就不需要在你的管道或指令中声明提供者了。

    如果您希望在使用此服务的每个组件或管道中添加新实例,则不要将此部分作为 ngModule.providers 的一部分,但您必须在每个管道或指令的提供者中声明它。

    【讨论】:

    • 那么我注入服务的每个指令都将具有相同的服务实例。我想要实现的是,为我放置在模板中的每个指令实例提供不同的服务实例。
    猜你喜欢
    • 2018-10-23
    • 2017-05-26
    • 2019-10-21
    • 1970-01-01
    • 1970-01-01
    • 2020-02-04
    • 2021-10-12
    • 2016-11-14
    • 1970-01-01
    相关资源
    最近更新 更多