#javascript #angular #typescript #dependency-injection #service
#javascript #angular #typescript #внедрение зависимостей #Обслуживание
Вопрос:
Я хочу внедрить свой сервис countries.service в свой модуль pricing.module и использовать его в компоненте ценообразования этого модуля. У меня обнаружена циклическая зависимость.
Это мой модуль
import { NgModule } from '@angular/core';
import { CommonModule } from '@angular/common';
import { PricingRoutingModule } from './pricing-routing.module';
import { DetailsPricingComponent } from './details-pricing/details-pricing.component';
import { ListPricingComponent } from './list-pricing/list-pricing.component';
@NgModule({
declarations: [DetailsPricingComponent, ListPricingComponent],
imports: [
CommonModule,
PricingRoutingModule,
],
})
export class PricingModule { }
Это прейскурант для компонента из моего модуля
import { Component, OnInit } from '@angular/core';
import { Post } from 'src/app/Interfaces/post';
import { CountriesService } from 'src/app/services/countries.service';
@Component({
selector: 'app-list-pricing',
templateUrl: './list-pricing.component.html',
styleUrls: ['./list-pricing.component.css'],
})
export class ListPricingComponent {
result:Array<Post>;
constructor(private service:CountriesService) { }
ngOnInit(): void {
this.service.getCountries().subscribe(data=>
{
console.log("hello")
this.result=data;
})
}
}
Ценообразование-маршрутизация.модуль
import { NgModule } from '@angular/core';
import { Routes, RouterModule } from '@angular/router';
import { DetailsPricingComponent } from './details-pricing/details-pricing.component';
import { ListPricingComponent } from './list-pricing/list-pricing.component';
const routes: Routes = [
{ path: '', component: ListPricingComponent },
{ path: 'detailsPricing', component: DetailsPricingComponent },
];
@NgModule({
imports: [RouterModule.forChild(routes)],
exports: [RouterModule],
})
export class PricingRoutingModule {}
ОБНОВИТЬ !!Это сработало нормально, когда я изменил синтаксис с @Injectable({ provideIn:….}) в service на providers [] в моем модуле. Я не знаю, в чем разница между ними?
Комментарии:
1. Вы уже предоставили COUNTRI-сервис где-нибудь еще? Можете ли вы выполнить поиск Countri Service во всех ваших модулях?
2. Нет, я не предоставлял его где-то еще
3. @HassenBouzlima: Можете ли вы показать, что входит
price-routing.module.ts
? у меня такое чувство, что в этом что-то не так. Не могли бы вы создать демонстрацию на stackblitz.com ?4. @ShashankVivek Я добавил его, проверьте .
5. @frozenkoi это раскрашиватель пар скобок
Ответ №1:
Хорошо, итак, я наткнулся на эту проблему в Angular github, в которой говорится о чем-то подобном. Из того, что я понял, либо использовать providers:[CountriesService]
в pricing.module.ts
или
создайте другой модуль, чтобы прервать эту циклическую проверку зависимостей, которая, похоже, выполняется компилятором Typescript.
Мое предложение состоит не в том, чтобы создавать новый модуль, а в том, чтобы придерживаться providers
синтаксиса.
Ответ №2:
Обычно и в 99% случаев предоставленное значение должно быть ‘root’, чтобы оно могло изменяться по дереву, это означает, что если оно нигде не используется в приложении, оно не будет включено в окончательный скомпилированный пакет.
Используйте приведенный ниже синтаксис, если у него есть область применения :
@Injectable({
providedIn: 'root',
})
export class CountriesService {
}
Для области действия модуля поместите его в массив providers модуля.
import { Injectable, NgModule } from '@angular/core';
@Injectable()
export class Service {
doSomething(): void {
}
}
@NgModule({
providers: [Service],
})
export class ServiceModule {
}
Замените имя вашего модуля и служб.
Для области видимости компонента поместите его в метаданные компонента.
Полезные ссылки: https://angular.io/guide/dependency-injection-providers#creating-tree-shakable-providers
Ответ №3:
Попробуйте удалить
import {PricingModule} from '../pricing/pricing.module';
из countries.service .. я подозреваю, что это вызывает циклическую зависимость.
Комментарии:
1. Тогда как я могу поместить PricingModule в @Injectable ({providedIn: PricingModule }) ?
2. попробуйте внедрить в root для проверки @Injectable({ providedIn: ‘root’, })
3. отлично ! если вы хотите, чтобы служба была ограничена модулем, то я думаю, вам нужно указать поставщика в вашем файле модуля. смотрите это angular.io/guide/providers
4. Я думаю, что @injectable({providedIn:MyModule}) в сервисе заменяет поставщика в модуле.