Angular 7: NullInjectorError: Нет провайдера для PagerService
Я пытаюсь реализовать нумерацию страниц, но это не работает. Вот мой код:
pager.service.ts:
import * as _ from 'underscore';
@Injectable({
providedIn: 'root',
})
export class PagerService {
getPager(totalItems: number, currentPage: number = 1, pageSize: number = 10) {
// calculate total pages
let totalPages = Math.ceil(totalItems / pageSize);
let startPage: number, endPage: number;
if (totalPages <= 10) {
// less than 10 total pages so show all
startPage = 1;
endPage = totalPages;
} else {
// more than 10 total pages so calculate start and end pages
if (currentPage <= 6) {
startPage = 1;
endPage = 10;
} else if (currentPage + 4 >= totalPages) {
startPage = totalPages - 9;
endPage = totalPages;
} else {
startPage = currentPage - 5;
endPage = currentPage + 4;
}
}
// calculate start and end item indexes
let startIndex = (currentPage - 1) * pageSize;
let endIndex = Math.min(startIndex + pageSize - 1, totalItems - 1);
// create an array of pages to ng-repeat in the pager control
let pages = _.range(startPage, endPage + 1);
// return object with all pager properties required by the view
return {
totalItems: totalItems,
currentPage: currentPage,
pageSize: pageSize,
totalPages: totalPages,
startPage: startPage,
endPage: endPage,
startIndex: startIndex,
endIndex: endIndex,
pages: pages
};
}
}
быстродействующие рабочие-list.component.ts:
import { JobService } from '@app/services';
import { PagerService } from './../../../services/pager.service';
import { Component, OnInit, Input } from '@angular/core';
import * as _ from 'underscore';
@Component({
selector: 'app-quick-worker-list',
templateUrl: './quick-worker-list.component.html',
styles: []
})
export class QuickWorkerListComponent implements OnInit {
S3ImageUrl: string;
// array of all items to be paged
private workerData: any[];
// pager object
pager: any = {};
// paged items
pagedItems: any[];
constructor(private pagerService: PagerService, private jobService: JobService) {
}
ngOnInit() {
this.jobService.getQuickJobWorkerList(1301, 1)
.map((response: Response) => response.json())
.subscribe(data => {
// set items to json response
this.workerData = data;
// initialize to page 1
this.setPage(1);
});
}
setPage(page: number) {
if (page < 1 || page > this.pager.totalPages) {
return;
}
// get pager object from service
this.pager = this.pagerService.getPager(this.allItems.length, page);
// get current page of items
this.pagedItems = this.allItems.slice(this.pager.startIndex, this.pager.endIndex + 1);
}
}
Я получаю эту ошибку:
QuickWorkerListComponent_Host.ngfactory.js? [sm]: 1 Ошибка: StaticInjectorError (AppModule) [QuickWorkerListComponent → PagerService]: StaticInjectorError (Платформа: ядро) [QuickWorkerListComponent → PagerService]: NullInjectorError: Нет поставщика для PagerService! в NullInjector.push../node_modules/@angular/core/fesm5/core.js.NullInjector.get(core.js: 3228) в resolToken (core.js: 3473) в tryResolveToken (core.js: 3417) в StaticInjector.push../node_modules/@angular/core/fesm5/core.js.StaticInjector.get(core.js: 3314) в resolToken (core.js: 3473) в tryResolveToken (core.js: 3417) в StaticInjector.push../node_modules/@angular/core/fesm5/core.js.StaticInjector.get(core.js: 3314) в resolNgModuleDep (core.js: 19784) в NgModuleRef_.push../node_modules/@angular/core/fesm5/core.js.NgModuleRef_.get(core.js: 20473) в resolNgModuleDep (core.js: 19784)
Ответы
Ответ 1
Следуя тексту ошибки, вы должны импортировать и добавить свой PagerService
в часть провайдера вашего файла app.module.ts
:
providers: [
PagerService,
],
И не забудьте объявить его как Injectable
:
@Injectable()
export class PagerService {
// ...
}
Ответ 2
Ваша ошибка связана с PagerService
, а не с подчеркиванием
NullInjectorError: Нет провайдера для PagerService! в
убедитесь, что сервис зарегистрирован в списке провайдеров на app.module или имеет Injectable
выражение в верхней части:
@Injectable({
providedIn: 'root',
})
Типичный пример обслуживания в угловых 7 ниже:
import { Injectable } from '@angular/core';
@Injectable({
providedIn: 'root',
})
export class MyService{
constructor() { }
}
пожалуйста, обратитесь к документации для более подробной информации.
Ответ 3
Для службы страниц или службы заданий должен быть применен атрибут Injectable, или проверьте, вводите ли вы что-либо в эти службы, то же самое относится и к этому.