NullInjectorError: Нет поставщика для SlicePipe

Я создал кастом pipe который использует другой встроенный pipeВот пример:

import { Pipe, PipeTransform } from '@angular/core';
import { SlicePipe } from '@angular/common';
import { isNumeric } from 'rxjs/util/isNumeric';

@Pipe({ name: 'range' })
export class RangePipe implements PipeTransform {
    constructor(private slicePipe: SlicePipe) { }

    transform(data: any, page: number, size: number): any {
        if (Array.isArray(data) && isNumeric(page) && isNumeric(size)) {
            const start_index = (page - 1) * size;
            if (data.length < start_index) {
                return [];
            } else {
                return this.slicePipe.transform(data.slice(start_index), size);
            }
        } else {
            return data;
        }
    }
}

Также добавили мой кастом pipe в app.module

@NgModule({
imports: [
    BrowserModule,
    FormsModule,
    routing
],
declarations: [
    AppComponent,
    ...
    RangePipe
],
providers: [],
bootstrap: [AppComponent]
})

Но получите ошибку

Ошибка: Uncaught (в обещании): Ошибка: StaticInjectorError(AppModule)[RangePipe -> SlicePipe]: StaticInjectorError(Платформа: ядро)[RangePipe -> SlicePipe]: NullInjectorError: Нет поставщика для SlicePipe!

Где моя проблема? Я забыл что-то зарегистрировать?

3 ответа

Решение

Предположим, вам нужно использовать пользовательский класс в угловых DI.

import {FactoryProvider} from "@angular/core";
import {SlicePipe} from "@angular/common";

class AwesomePipe{
  constructor(private slicePipe: SlicePipe){

  }
}

и это зависит от некоторых других классов

class AwesomeClassProvider implements FactoryProvider{ 
  provide: AwesomePipe;
  useFactory(pipe: SlicePipe) {
    return new AwesomePipe(pipe);  
  }
  deps: [SlicePipe]
}
      @NgModule({
imports: [
    ...
],
declarations: [
    ...
],
providers: [RangePipe],
bootstrap: [AppComponent]
})

Просто расширяет SlicePipe

import { Pipe, PipeTransform } from '@angular/core';

import { SlicePipe } from '@angular/common';
import { isNumeric } from 'rxjs/util/isNumeric';

@Pipe({ name: 'range' })
export class RangePipe extends SlicePipe implements PipeTransform {
    public transform(data: any, page: number, size: number): any {
        if (Array.isArray(data) && isNumeric(page) && isNumeric(size)) {
            const start_index = (page - 1) * size;
            if (data.length < start_index) {
                return [];
            } else {
                return super.transform(data.slice(start_index), size);
            }
        } else {
            return data;
        }
    }
}

Надеюсь, это поможет.

Другие вопросы по тегам