Angular - динамическое добавление компонентов в разные родительские элементы

Я хочу создать многоэтапную форму, где каждый шаг представляет собой отдельную вкладку, и пользователь может перемещаться вперед / назад по форме. Каждая вкладка имеет заголовок, содержимое и кнопки навигации.

В моем компоненте формы у меня есть массив всех компонентов (каждый представляет собой шаг в форме), и я хочу перебрать его в шаблоне формы, чтобы каждый шаг имел одинаковую структуру, и если я хочу изменить эту структуру, я следует изменять только код в цикле, так как он одинаков для всех шагов.

Это массив в form.component.ts:

steps = [
    LanguageComponent,
    CodeComponent,
    HardwareComponent,
    SubmissionComponent
]

Или должно быть:

steps = [
    new LanguageComponent,
    new CodeComponent,
    new HardwareComponent,
    new SubmissionComponent
]

?

Это псевдо-форма.component.html:

<div id = "tabs">
    <div class = "tab" *ngFor = "let step of steps" id = "{{step.header}}">
        {{ step.header }}
        <app-step></app-step>
        {{ buttons }}
    </div>
</div>

Каждый компонент шага имеет свойство заголовка.

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

Как бы вы это сделали, есть ли лучший способ добиться такой структуры?

Спасибо!

Добро пожаловать. «В моем компоненте формы у меня есть массив всех компонентов» <- поделитесь им (а также всем соответствующим кодом, который может отсутствовать).

Jeto 16.12.2018 15:15

@Jeto Я только что добавил!

Nikolay Nikolov 16.12.2018 15:25
Поведение ключевого слова "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) для оценки ваших знаний,...
0
2
43
1

Ответы 1

Вам нужен компонент-заполнитель, который содержит структуру вкладок формы. Затем, как вы сказали, у вас есть только 1 место, где вам нужно изменить макет.

AppFormTabComponent.html

<ngb-tabset>
    <ngb-tab>
        <ngbTemplate>
           <language-component [form] = "form"></language-component>
        </ngbTemplate>
    </ngb-tab>
    <ngb-tab>
        <ngbTemplate>
           <code-component [form] = "form"></code-component>
        </ngbTemplate>
    </ngb-tab>
    ...
</ngb-tabset>

Тогда вы должны вызвать свой AppFormTabComponent только один раз, чтобы использовать его

form.component.html

<app-form-tab-component [form] = "form"></app-form-tab-component>

И ваша форма будет на странице app.component.ts, и вы передадите ее в каждый из ваших шаблонов.

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