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;
}
}
}
Надеюсь, это поможет.