Angular использует несколько экземпляров службы родительского компонента для дочернего

Я видел эту тему: Использование нескольких экземпляров одной и той же службы . Можно ли использовать один и тот же несколько экземпляров службы от родительского к дочернему?

Например, у меня есть ElementService в ParentComponent и есть 2 экземпляра этой службы.

{ provide: 'instance1', useClass: ElementService},
{ provide: 'instance2', useClass: ElementService},

Как мне использовать instance1 в Child1Component и instance2 в Child2Component?


person Emmanuel Sayson    schedule 30.07.2020    source источник


Ответы (2)


Когда вы указываете провайдеров в декораторе компонента, внедряемые провайдеры становятся специфичными для этого компонента, см. Angular — Предоставление зависимостей

Это также полезная информация об внедрении зависимостей.

Поэтому просто укажите службу в массиве поставщиков обоих компонентов, и у вас должны быть уникальные экземпляры службы в обоих компонентах.

@Component({
    selector: 'app-page',
    templateUrl: './page.component.html',
    styleUrls: ['./page.component.scss'],
    providers: [
        ElementService
    ]
})
export class PageComponent implements OnInit {...
person James    schedule 30.07.2020

Вы можете внедрить именованный провайдер в конструктор каждого дочернего компонента (а также в родительский конструктор):

Child1Component

constructor(@Inject('instance1') private service: ElementService) { }

Child2Component

constructor(@Inject('instance2') private service: ElementService) { }

Вот рабочий пример со счетчиком: https://stackblitz.com/edit/angular-ivy-usorby?file=src%2Fapp%2Fchild1%2Fchild1.component.ts

person Gérôme Grignon    schedule 30.07.2020
comment
Привет, Джером, спасибо, но мне нужно, чтобы 2 экземпляра были объявлены в родительском, потому что родитель также подпишется на 2 экземпляра службы. В вашем примере AppComponent также будет прослушивать изменения в экземплярах DataService дочерних1 и дочерних2. - person Emmanuel Sayson; 30.07.2020
comment
также внедрить провайдеров внутри родительского компонента. Я обновил пример stackblitz. - person Gérôme Grignon; 30.07.2020
comment
привет, ты можешь ответить на это? stackoverflow.com/questions/64274610/ - person ; 09.10.2020
comment
привет, ответ, уже включенный в проблему (добавление службы в качестве поставщика непосредственно в метаданные компонента), должен работать. - person Gérôme Grignon; 09.10.2020