основной app.component запрашивает данные из веб-сервиса
затем он устанавливает переменную в службе с именем ядроСервис, которая везде внедряется для доступа к этим данным.
проблема в том, что другие компоненты загружаются до app.component получает информацию, поэтому я получаю массу неопределенных проблем
Я не извлекаю данные из coreService, иначе веб-сервис вызывается несколько раз (пытался использовать условие и канал(), но он не работает)
Я пытался использовать AfterViewInit, но он работает с перебоями.
приложение.компонент:
ngOnInit() {
this.catalogService.getCampaign().then((data: any) =>
{
this.coreService.campaign=data;
});
}
products.component: (компонент, загружаемый в роутер)
constructor(private coreService:CoreService)
{}
ngAfterViewInit()
{
Promise.resolve(null).then(() => { // to avoid value changed error b@#!t from angular
if (this.coreService.campaign)
{
... // we should be here
}
else
{
console.dir(this.coreService);
throw "campaign not loaded yet";
}
});
}
Я хочу, чтобы два компонента были синхронизированы, я имею в виду, что компонент продукты должен ждать, пока ядроСервис получит свои данные.
это не определено в цепочке, затем:
@Injectable({
providedIn: 'root'
})
export class AppResolver implements Resolve<boolean> {
constructor(private catalogService: CatalogService, private coreService:CoreService) { }
public resolve(route: ActivatedRouteSnapshot): Promise<boolean>
{
return this.catalogService.getCampaign(CoreService.CAMPAIGN_IDENTIFIER,null).then((data: any) =>
{
this.coreService.campaign=data;
return true;
})
.then(function(result) : Promise<boolean>
{
// below this is undefined and throws an error
//////////////////////////////////////////////
return this.catalogService.getCampaign(CoreService.CAMPAIGN_IDENTIFIER,null).then((data: any) => {
this.coreService.campaign=data;
return true;
});
});
}
}
вы должны получить данные в Резольвер.
@Injectable({
providedIn: 'root'
})
export class MyDataResolverService implements Resolve<boolean> {
constructor(private catalogService: CatalogService, private coreService:CoreService) { }
public resolve(): Promise<boolean> {
return this.catalogService.getCampaign().then((data: any) => {
this.coreService.campaign=data;
return true;
});
}
}
затем используйте преобразователь в конфигурации маршрута
...
{
path: '',
component: AppComponent,
resolve: {
dataResolved: MyDataResolverService
}
}
....
У меня ошибка с route(), я не понимаю, почему она не работает.... Я обновил свой вопрос изображением
ошибка с route () - это моя ошибка, «класс экспорта MyDataResolverService реализует Resolve <ture>» должен был быть «класс экспорта MyDataResolverService реализует Resolve <boolean>». я обновил свой пост. маршрут, который я добавил, является просто примером, показывающим, как это делается, это не точная реализация, подходящая для вашего конкретного варианта использования, поскольку я не знаю, как вы обрабатываете маршрутизацию. вам следует добавить преобразователь в соответствующее место в конфигурации вашего маршрута, например, туда, где вы направляетесь к products.component. если вы добавите свою конфигурацию маршрута, я могу помочь.
Хорошо, это строится, но что, если мне нужно связать множество запросов веб-сервисов, прежде чем выполнять разрешение, и они зависят друг от друга?
вы должны связывать промисы в resolve(), как описано здесь javascript.info/обещание-цепочка
Я рад, что это помогает. пожалуйста, не забудьте проголосовать и принять ответ.
Затем я попытался добавить второй, но внутри него это не определено, я думаю, мне следует использовать привязку, но я подозреваю, что делаю что-то не так, я обновил свой вопрос
Я возвращаю это из одного обещания в другое, я обнаружил, что также могу сделать ()=>это.что-то.. но мне не нравится синтаксис
вы должны использовать синтаксис толстой стрелки. в противном случае вы получите неопределенную ошибку для «этого». есть раздел "Что это?" в этой статье hacks.mozilla.org/2015/06/es6-глубинные-стрелочные-функции взгляните на нее.
маршрут должен быть добавлен в модуль маршрутизации приложений? У меня нет записи для этого