Как динамически изменять имя компонента в angular?

#angular

#angular

Вопрос:

Ниже приведен пользовательский компонент:

 <app-variable-component-1></app-variable-component-1>
  

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

Вот так:

 import { Component, OnInit } from '@angular/core';

@Component({
  selector: 'app-parent-component',
  templateUrl: './parent-component.component.html',
  styleUrls: ['./parent-component.component.less']
})
export class ParentComponentComponent implements OnInit {

currentOption = 1

  constructor() { }

  ngOnInit(): void {
  }

onSelectOption(option) {
this.currentOption = option
}

}

  

используя это свойство, я хочу динамически изменять компонент. Я знаю, что мог бы использовать *ngIf для каждого элемента, подобного этому:

 <app-variable-component-1 *ngIf="currentOption === '1'"></app-variable-component-1>
<app-variable-component-2 *ngIf="currentOption === '2'"></app-variable-component-2>
<app-variable-component-3 *ngIf="currentOption === '3'"></app-variable-component-3>
  

Но вместо этого я хочу сократить код примерно так:

 <app-variable-component-{{currentOption}} ></app-variable-component-{{currentOption}}>

  

Возможно ли что-то подобное в angular?

Комментарии:

1. Вы можете использовать ngSwitch, но то, что у вас есть, невозможно

2. есть ли что-нибудь подобное, что я могу сделать??

Ответ №1:

Я не знаю, возможен ли такой способ, но вы можете создать экземпляр динамического компонента с ngComponentOutlet помощью директивы. Вы передаете активный компонент в директиве.

В HTML:

 <ng-container *ngComponentOutlet="activeComponent"></ng-container>
  

В TS:

 import { Component1 } from './../component1';
import { Component2 } from './../component2';


/** ...SOME DECLARATIONS HERE.... **/

get activeComponent() {
 switch(this.currentOption) {
   case 1: return Component1;
   case 2 : return Component2;
 }
}
  

Комментарии:

1. Если у вас есть переключатель внутри этого … для чего не использовать ngswitch или для чего не использовать ngif в html… это то же самое, но с ngComponentOutlet более сложным и ненужным

2. Но *ngSwitch и *ngIf вам нужно поместить все компоненты в HTML, и я думаю, что он этого не хотел.

3. Я знаю … но это не то, что он хочет, это то, что хорошо сделано

Ответ №2:

то, что у вас есть, невыполнимо, вы можете использовать ngSwitch , чтобы немного его очистить:

 <div [ngSwitch]="currentOption">
  <app-variable-component-1 *ngSwitchCase="'1'"></app-variable-component-1>
  <app-variable-component-2 *ngSwitchCase="'2'"></app-variable-component-2>
  <app-variable-component-3 *ngSwitchCase="'3'"></app-variable-component-3>
</div>
  

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

Комментарии:

1. это вовсе не повторение кода. Это оператор switch.

2. если это возможно.. это будет здорово: <app-variable-component-{{currentOption}} ></app-variable-component-{{currentOption}}>

3. как я уже сказал, это невозможно и даже не рекомендуется. У вас будет сложное в обслуживании и подверженное ошибкам приложение.

4. да … но это проще … правильно …. есть ли способ создать пользовательскую функцию или директиву для достижения таких результатов <app-variable-component-{{currentOption}} ></app-variable-component-{{currentOption}}>

5. В последний раз. НЕТ, это невозможно…. это меньше нажатий клавиш, но это не проще и не лучшая практика. У вас не будет возможности проверить правильность ваших шаблонов, поскольку переменная может измениться или селекторы могут измениться. Это делает ваше приложение подверженным сбоям или сбоям. чем меньше кода, тем лучше, если он создает возможность для ошибок. Единственное, что вы действительно могли бы рассмотреть, это абстрагирование этого переключателя в какой-то отдельный app-variable-switch компонент, внутри которого есть этот переключатель и который принимает входные данные, но это добавляет другие сложности.