Исключить компонент, который ломает Angular Universal - PullRequest
2 голосов
/ 29 марта 2019

Я использовал ng-toolkit с ng add @ng-toolkit/universal, чтобы добавить поддержку Angular Universal в мой проект.

Я могу создать сборку prod без ошибок, плюс я могу запустить сервер, снова без каких-либо ошибок. Он просто «застревает», когда к нему приходит запрос (nodeJS не выводит никакого вывода).

Я обнаружил, что один из моих компонентов нарушает рендеринг на стороне сервера. Я узнал, что проблема с мат-каруселью:

компонент:

export class BannerComponent {

  slides: any[] = [
    // tslint:disable-next-line:max-line-length
    { image: 'assets/banner/banner-one.png' },
    // tslint:disable-next-line:max-line-length
    { image: 'assets/banner/banner-two.png' },
    // tslint:disable-next-line:max-line-length
    { image: 'assets/banner/banner-three.png' }
  ];

}

шаблон:

<section class="sec-space-b" id="banner">
    <mat-carousel
        timings="250ms ease-in"
        [autoplay]="true"
        interval="5000"
        color="accent"
        maxWidth="auto"
        proportion="25"
        slides="5"
        [loop]="true"
        [hideArrows]="false"
        [hideIndicators]="false"
        [useKeyboard]="true"
        [useMouseWheel]="false"
        orientation="ltr"
      >
        <mat-carousel-slide
            #matCarouselSlide
            *ngFor="let slide of slides; let i = index"
            overlayColor="#00000000"
            [image]="slide.image"
            [hideOverlay]="false"
        ></mat-carousel-slide>
    </mat-carousel>
</section>

Как я могу решить эту проблему? Могу ли я как-то исключить конкретный компонент из сборки на стороне сервера?

1 Ответ

1 голос
/ 09 апреля 2019

Исправление простое, вы должны использовать токен PLATFORM_ID вместе с методом isPlatformBrowser или isPlatformServer.

Внутри вашего шаблона используйте оператор #ngIf:

<section class="sec-space-b" id="banner" *ngIf="isBrowser">

И внутри кода компонента инициализируйте поле isBrowser как:

import { isPlatformBrowser } from '@angular/common';
import { Component, OnInit, Inject, PLATFORM_ID } from '@angular/core';


@Component({
  selector: 'app-home-banner',
  templateUrl: './banner.component.html',
  styleUrls: ['./banner.component.scss']
})
export class BannerComponent implements OnInit {

  public isBrowser = isPlatformBrowser(this.platformId);

  constructor(@Inject(PLATFORM_ID) private platformId: any) { }
}

Подробнее о isPlatformServer и isPlatformBrowser вы можете прочитать в этой статье (они там используются): https://www.twilio.com/blog/create-search-engine-friendly-internationalized-web-apps-angular-universal-ngx-translate

Вы также можете проверить мой доклад об Angular Universal (13:26 - о запуске другого кода в браузере и на сервере): https://www.youtube.com/watch?v=J42mqpVsg0k

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