Инъекция ActivatedRoute дает ошибку циклической зависимости - PullRequest
1 голос
/ 13 июня 2019

Я пытаюсь использовать ActivatedRoute в сервисе области приложения, но получаю ошибку циклической зависимости. Я не понимаю и не знаю, как устранить неполадки.

В моем приложении есть служба для получения Сообщества из параметра маршрута верхнего уровня.
Этот сервис используется в моем приложении в нескольких компонентах и ​​других сервисах.
Когда я вставляю ActivatedRoute в свой конструктор, я получаю

Error: Provider parse errors:
Cannot instantiate cyclic dependency! Router ("[ERROR ->]"): in NgModule AppModule in ./AppModule@-1:-1

Когда я вместо этого вставляю Injector iteslf, а затем получаю ActivatedRoute в конструкторе, я получаю ошибку рекурсии. Когда я получаю ActivatedRoute чуть позже в методе, он работает как положено.

@Injectable()
export class CommunityService {

    constructor(
        private injector: Injector
        // private router: ActivatedRoute => Cyclic dependency
    ) {
        // const router = this.injector.get(ActivatedRoute); => InternalError: "too much recursion"
    }

    public getCommunity(): Community {
        const router = this.injector.get(ActivatedRoute); // this should not be needed
        const communityCode = router.snapshot.paramMap.get('community');
        return getCommunityByCode(communityCode);
    }
}

Подобные вопросы уже есть, но они касаются HttpInterceptors. Это регулярный сервис.

При создании Stackblitz для @ Alex Я понял, что мы предоставили услугу сообщества во время APP_INITIALIZER. Это был недостающий кусок.

import { NgModule }      from '@angular/core';
import { BrowserModule } from '@angular/platform-browser';
import { AppComponent }  from './app.component';
import { ContentService } from '@common/services/content.service';

export function loadContent(content: ContentService) {
    return () => content.load();
}

@NgModule({
  imports:      [ BrowserModule ],
  declarations: [ AppComponent ],
  bootstrap:    [ AppComponent ],
  providers: [ { provide: APP_INITIALIZER, useFactory: loadContent, deps: [ContentService], multi: true }],
})
export class AppModule { }

Ответы [ 2 ]

1 голос
/ 13 июня 2019

Попробуйте удалить private injector: Injector, удерживайте private router: ActivatedRoute и вызывайте переменную router везде, где хотите, используя this.router. Если это все еще не работает, мне понадобится код в stackblitz или где-то еще, чтобы я мог взглянуть глубже на ваш код

0 голосов
/ 16 июля 2019

При предоставлении услуги во время APP_INITIALIZER еще не все угловые сервисы инициализируются.Однако конструктор ContentService ожидал внедрения инициализированного ActivatedRoute.Это как-то привело к циклической зависимости.

providers: [ { provide: APP_INITIALIZER, useFactory: loadContent, deps: [ContentService], multi: true }],

Когда услуга предоставляется как другие услуги, это уже не так.

providers: [ ContentService ]
...