Загрузка нескольких модулей в Angular 6 через массив

можно ли объявить массив и использовать его для загрузки нескольких компонентов в module.ts. Я пробовал что-то вроде этого

    export var initialComponents = [];
    initialComponents.push(AppComponent);
    if (condition) {
      initialComponents.push(IchFooterComponent);
    }

а потом

bootstrap: initialComponents

Что дает мне следующую ошибку

Error: The module oa was bootstrapped, but it does not declare "@NgModule.bootstrap" components nor a "ngDoBootstrap" method. Please define one of these.

Вы объявили @ngModule? @NgModule({ declarations: initialComponents | Array<Type<any> | any[], bootstrap: Array<Type<any> | any[] })

Gary 10.07.2018 09:47

да, я объявил модуль ng

Angshu Guha 10.07.2018 09:52
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
4
2
3 938
2

Ответы 2

Попробуйте еще раз (ниже пример кода):

import { BrowserModule } from '@angular/platform-browser';
import { NgModule } from '@angular/core';
import { FormsModule } from '@angular/forms'; // <-- NgModel lives here

import { AppComponent } from './app.component';
import { HeroesComponent } from './heroes/heroes.component';

var initialComponents: any[] = []; 

initialComponents.push(AppComponent);
if (true) {
  initialComponents.push(HeroesComponent);
}

@NgModule({
  declarations: initialComponents,
  imports: [
    BrowserModule,
    FormsModule
  ],
  providers: [],
  bootstrap: [AppComponent]
})
export class AppModule { }

Попробуйте еще раз:

https://stackblitz.com/edit/angular-vimqb1?file=src/app/app.module.ts

Мне нужно объявить несколько компонентов внутри начальной загрузки, только некоторые из них должны появиться в зависимости от условия. В вашем примере сначала загружается компонент приложения, а затем изнутри приложения вы загружаете компонент героев, который не является моим вариантом использования.

Angshu Guha 10.07.2018 11:18

Попробуйте привести все в состояние или внешнее состояние, которое должно работать. Это тип объявления в виде массива. Насколько я понимаю, как бы это ни работало.

Gary 10.07.2018 13:30

Вы можете настроить начальную загрузку, реализовав ngDoBootstrap как метод AppModule. Вы можете перечислить свои компоненты, которые необходимо загрузить, в свойстве entryComponents@NgModule.

@NgModule({
    entryComponents: [AComponent, BComponent, ...]
    ...
 })
 export class AppModule {

     constructor() {}

 ngDoBootstrap(app: ApplicationRef) {
     if (Math.random() > 0.5) {
         appRef.bootstrap(AComponent, '#app');
     } else {
         appRef.bootstrap(BComponent, '#app');
     }
 }

Если вам нужен сервис, вы можете получить к нему доступ через внедрение зависимостей (поместите его в AppModule как параметр конструктора). Но я не знаю, есть ли у него какие-то ограничения по сравнению с DI в компонентах или сервисах. Вот документы для ApplicationRef и его метода начальной загрузки.

Спас мой день! бутстрап: [условие? ComponentOne: ComponentTwo] работал в режиме разработки, но ng build --prod вылетал из строя: «Значение в позиции 0 в NgModule.bootstrap AppModule не является ссылкой: [object Object». Строится и отлично работает после удаления «bootstrap:» и реализации через ngDoBootstrap.

Volodymyr Krupach 24.07.2020 17:25

К сожалению, содержимое декоратора (например, @NgModule) (например, bootstrap) очень хрупкое и должно быть «очень статичным», особенно для случая сборки, когда используется много угловых оптимизаций)

mPrinC 01.09.2020 12:43

Другие вопросы по теме