Valor-software / ngx-bootstrap помещает компонент в динамически создаваемый контент

Я пытаюсь использовать valor-software / ngx-bootstrap, чтобы создать динамическую вкладку, но я хочу поместить селектор компонента внутри динамически создаваемого содержимого вкладки,

В примере документации мы имеем:

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

@Component({
  selector: 'demo-tabs-dynamic',
  changeDetection: ChangeDetectionStrategy.OnPush,
  templateUrl: './dynamic.html'
})
export class DemoTabsDynamicComponent {
  tabs: any[] = [
    { title: 'Dynamic Title 1', content: 'Dynamic content 1' },
    { title: 'Dynamic Title 2', content: 'Dynamic content 2', disabled: 
true },
    { title: 'Dynamic Title 3', content: 'Dynamic content 3', 
removable: true }
  ];

  addNewTab(): void {
    const newTabIndex = this.tabs.length + 1;
    this.tabs.push({
      title: `Dynamic Title ${newTabIndex}`,
      content: `Dynamic content ${newTabIndex}`,
      disabled: false,
      removable: true
    });
  }

}

И я хочу сделать что-то вроде этого:

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

@Component({
  selector: 'demo-tabs-dynamic',
  changeDetection: ChangeDetectionStrategy.OnPush,
  templateUrl: './dynamic.html'
})
export class DemoTabsDynamicComponent {
  tabs: any[] = [
    { title: 'Dynamic Title 1', content: 'Dynamic content 1' },
    { title: 'Dynamic Title 2', content: 'Dynamic content 2', disabled: 
true },
    { title: 'Dynamic Title 3', content: 'Dynamic content 3', 
removable: true }
  ];

  addNewTab(): void {
    const newTabIndex = this.tabs.length + 1;
    this.tabs.push({
      title: `Dynamic Title ${newTabIndex}`,
      content: `<my-component></my-component>`, // Here is the change
      disabled: false,
      removable: true
    });
  }
}

Angular преобразует селектор компонентов в строку. Есть ли обходной путь?


person user4092086    schedule 21.12.2017    source источник


Ответы (1)


На самом деле я использовал этот подход, при котором не нужно указывать какой-либо html в контенте.

 <tabset >
    <tab *ngFor="let tabz of mainMenuTab.tabs"
         [heading]="tabz.title"
         [active]="tabz.active"
         (select)="tabz.active = true"
         (deselect)="tabz.active = false"
         [disabled]="tabz.disabled"
         [removable]="tabz.removable"
         (removed)="removeTabHandler(tabz)"
         [customClass]="tabz.customClass">
            <div [ngSwitch]="tabz?.content">
               <app-employees-menu *ngSwitchCase="'employee'">
               </app-employees-menu>
               <app-inventories-menu *ngSwitchCase="'inventory'">
               </app-inventories-menu>
               <app-customers-menu *ngSwitchCase="'customer'">
               </app-customers-menu>
            </div>
    </tab>
 </tabset>

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

person user4092086    schedule 23.12.2017
comment
Это хорошее решение, но я сомневаюсь, что все компоненты могут запускаться независимо от установленных вами условий. Поправь меня @ user4092086 - person Abhijit Muke; 13.03.2018
comment
@AbhijitMuke Нет, они не будут инициированы, и когда условие истинно, они будут инициированы только один раз, так что это похоже на ленивую загрузку, я уже тестировал это - person user4092086; 13.03.2018