Почему не отображается спиннер?

Файл Index.html:

<body>
    <mat-spinner></mat-spinner>
</body>

Файл app.module:

@NgModule({

 imports: [
        BrowserModule,
        AppRoutingModule,
        BrowserAnimationsModule,
        MatProgressSpinnerModule,
        BrowserAnimationsModule
]
})

Я вижу на странице тег <mat-spinner></mat-spinner>, но он не работает, ошибок в консоли нет


person Community    schedule 03.08.2020    source источник
comment
Вы поместили счетчик в свой index.html? Вы должны поместить его под угловой вид   -  person Armen Stepanyan    schedule 03.08.2020
comment
вы можете показать счетчик с полным CSS во время загрузки Angular. Так что вам не нужен Angular для его рендеринга ...   -  person Random    schedule 03.08.2020


Ответы (1)


Компоненты Angular не могут быть отрисованы сами по себе внутри файла index.html. Вот почему по умолчанию AppComponent загружается через файл main.ts.

Вы должны включить mat-spinner в угловой компонент. Если счетчик предназначен для отображения при ускорении приложения, вы должны использовать настраиваемый счетчик, который затем можно включить в index.html:

<app-root><div id="spinner"></div></app-root>

Чтобы отобразить счетчик при ленивой загрузке модуля при маршрутизации, вы можете прослушать router.events в компоненте, содержащем <router-outlet>:

loading: boolean;

  constructor(private router: Router) {
    router.events.subscribe(event => {
      if (event instanceof NavigationStart) {
        this.loading = true;
      }
      if (event instanceof NavigationEnd || event instanceof NavigationError || event instanceof NavigationCancel) {
        this.loading = false;
      }
    });
  }

и условно отобразите свой счетчик:

<mat-spinner *ngIf="loading"></mat-spinner>

вот пример stackblitz (но счетчик не отображается, поскольку модули загружаются слишком быстро): https://stackblitz.com/edit/angular-ivy-xwd2ta?file=src%2Fapp%2Fapp.component.ts

person Gérôme Grignon    schedule 03.08.2020
comment
Я пытаюсь показать счетчик, пока не загрузится ленивый модуль, когда он загрузится, он заменит содержимое ‹app-root› - person ; 03.08.2020
comment
Могу я использовать это как <app-root><mat-spinner></mat-spinner></app-root> - person ; 03.08.2020
comment
вы не можете использовать проекцию контента в селекторе корневого приложения, поскольку он объявлен вне области действия angular. - person Gérôme Grignon; 03.08.2020
comment
Как тогда использовать загрузчик для ленивой загрузки модулей - person ; 03.08.2020
comment
вы можете добавить его в html-файл appComponent и прослушивать router.events, чтобы перехватить события NavigationSatr и NavigationEnd, чтобы действовать при условном рендеринге - person Gérôme Grignon; 03.08.2020
comment
У меня есть несколько модулей, и я не хочу дублировать код в каждом из компонентов. - person ; 03.08.2020
comment
Спасибо, но ваш пример не скрывает загрузчик после загрузки - person ; 03.08.2020
comment
это происходит на NavigationEnd = ›this.loading = false - person Gérôme Grignon; 03.08.2020
comment
Всегда ложно: {{ loading }} при перезагрузке страницы f5 - person ; 03.08.2020
comment
Вы говорили о необходимости ленивой загрузки модулей («Как тогда использовать загрузчик для ленивой загрузки модулей»). Это решение, когда вы переходите на ленивый загруженный маршрут, а не на f5 - person Gérôme Grignon; 03.08.2020
comment
для счетчика при ускорении приложения вы можете включить его в селектор корневого приложения: <app-root><div id="spinner></div></app-root>" с некоторым стилем, но это не может быть mat-spinner, поскольку он должен находиться внутри угловой области - person Gérôme Grignon; 03.08.2020