Angular 8: рендеринг дочернего компонента после того, как требуемые данные получены через HTTP-вызов - PullRequest
0 голосов
/ 20 апреля 2020

В моем шаблоне AppComponent у меня есть 3 дочерних компонента - HeaderComponent, MenuComponent, ContentComponent. Данные для дочернего компонента - MenuComponent динамически загружаются через HTTP-запрос. Если я сделаю HTTP-вызов через службу в ngOnInit или в конструкторе компонента, данные не будут загружены, и представление не будет отображать данные. Я хочу подождать, пока данные для меню вернутся как ответ, после того, как я сделаю HTTP-вызов, а затем отобразить MenuComponent с данными.

Я новичок в Angular, было бы очень здорово, если бы кто-то может предложить решение.

app.component. html

<div class="wrapper">
    <app-header></app-header>
    <app-menu></app-menu>
    <app-content></app-content>
</div>

menu.component.ts

import { Component, OnInit } from '@angular/core';
import { MainMenuService } from "main-menu.service";

@Component({
  selector: 'app-menu',
  templateUrl: './menu.component.html',
  styleUrls: ['./menu.component.scss']
})
export class MenuComponent implements OnInit {
  mainMenuData;

  constructor(public menuService: MainMenuService) { }

  ngOnInit() {
    this.mainMenuData = this.menuService.getDataforMenu();
  }
}

menu.component. html

<nav>
    <ul>
         <li *ngFor="let mainMenu of mainMenuData">
                <a class="main-menu" href="{{ mainMenu.href }}">{{ mainMenu.name }}</a>
          </li>
    </ul>
</nav>

main-menu.service.ts

import { Injectable } from '@angular/core';
import { HttpClient, HttpHeaders } from '@angular/common/http';

@Injectable({
  providedIn: 'root'
})
export class MainMenuService {
  menu;

  constructor(private httpClient: HttpClient) { }

  getDataforMenu() {
    this.httpClient.get(URL).subscribe(
      (response: any) => {
        return response;
      },
      (error: any) => {

      }
    );
  }
}

1 Ответ

0 голосов
/ 20 апреля 2020

Обновите ваш html файл, как

<div class="wrapper">
    <app-header></app-header>
    <app-menu *ngIf="isMenuDataLoaded"></app-menu>
    <app-content *ngIf="isContentDataLoaded"></app-content>
</div>

Затем добавьте переменные в ваш файл ts, значение которых по умолчанию будет ложным, и установите его в true, когда вы получаете данные из API

Like

isMenuDataLoaded = false;
isContentDataLoaded = false;

ngOnInit() {
   // your API call

  this.menuService.getDataforMenu().subscribe(
      (response: any) => {
         this.mainMenuData = response;
         this.isMenuDataLoaded = true;
      },
         (error: any) => {

     }
}

Также вам необходимо обновить ваш сервис

getDataforMenu() {
   return this.httpClient.get(URL);
}

Это обеспечит и проинформирует angular о загрузке компонента при наличии данных.

Примечание Я использовал логическое, просто для простоты. Если вы получаете данные в виде массива, вы можете проверить с помощью свойства .length

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...