Чтобы перенести проект с Angular 5 на Angular 8, я создал пустой проект с Angular CLI и скопировал свои модули, компоненты и службы в свою новую структуру проекта. Проект строится, но при выполнении я получаю классическое сообщение «Нет провайдера для HttpClient в обслуживании»:
ERROR NullInjectorError: StaticInjectorError(AppModule)[TimeService -> HttpClient]:
StaticInjectorError(Platform: core)[TimeService -> HttpClient]:
NullInjectorError: No provider for HttpClient!
at NullInjector.get (http://localhost:4200/vendor.js:50573:27)
at resolveToken (http://localhost:4200/vendor.js:52359:24)
at tryResolveToken (http://localhost:4200/vendor.js:52285:16)
at StaticInjector.get (http://localhost:4200/vendor.js:52148:20)
at resolveToken (http://localhost:4200/vendor.js:52359:24)
at tryResolveToken (http://localhost:4200/vendor.js:52285:16)
at StaticInjector.get (http://localhost:4200/vendor.js:52148:20)
at resolveNgModuleDep (http://localhost:4200/vendor.js:76198:29)
at _createClass (http://localhost:4200/vendor.js:76275:32)
at _createProviderInstance (http://localhost:4200/vendor.js:76231:26)
Я считаю, что мой app.module.ts в порядке: я импортирую HttpClientModule и помещаю его в импорт @NgModule сразу после BrowserModule.
@NgModule({
declarations: [AppComponent,DelegationsComponent],
imports: [BrowserModule,
HttpClientModule,
GlobalModule.forRoot(),
AuthenticationModule,
DelegationModule,
routing,
FormsModule,
ReactiveFormsModule,
BrowserAnimationsModule,
ButtonModule, TableModule, DialogModule, DropdownModule, ToastModule, TabViewModule, InputTextModule, AutoCompleteModule, TooltipModule, CheckboxModule, OverlayPanelModule, MultiSelectModule, CalendarModule ],
providers: [APP_ROUTER_PROVIDERS, {provide: APP_BASE_HREF, useValue: getBaseHref()}],
bootstrap: [AppComponent]
})
Похоже, ошибка в TimeService. В этой службе HttpClient импортируется и вводится в конструктор.
import {HttpClient} from "@angular/common/http";
@Injectable()
export class TimeService extends BaseService {
constructor(private http: HttpClient)
Затем TimeService вводится в DelegationsComponent.
import {TimeService} from "utils/time.service";
@Component({
moduleId: __moduleName,
selector: 'delegations',
templateUrl: './delegations.component.html'
})
export class DelegationsComponent implements OnInit, OnDestroy {
constructor(private timeService: TimeService)
И вы можете увидеть DelegationsComponent в моих объявлениях app.module.ts.
Любая идея ? Спасибо
РЕДАКТИРОВАТЬ: Пытаясь воспроизвести проблему на небольшом примере, я нашел причину: time.service.ts находится не в моем приложении angular, а в папке снаружи, потому что я делюсь им. с двумя другими угловыми приложениями. Я включаю его благодаря package.json моих приложений:
"utils": "file:../../../../../utils"
Итак, time.service.ts заканчивается на node_modules / utils. Если я помещу его в каталог src / app, он работает. Есть идеи, почему это не работает, и как я могу поделиться сервисом между несколькими приложениями angular?