Как обеспечить входы и выходы для динамических компонентов
Я столкнулся с пакетом https://github.com/gund/ng-dynamic-component, борясь с Angular ngComponentOutlet
unacheiveable @Input
с и @Output
с взаимодействий.
В моем приложении я хотел бы динамически создавать экземпляры различных типов компонентов вкладок в *ngFor
,
Чтение документации https://github.com/gund/ng-dynamic-component, взаимодействие с @Input
с и @Output
s не находится в шаблоне HTML, а в самой реализации компонента.
Учитывая тот факт, что мне нужно запустить все мои вкладки, каждая вкладка должна получить разные @Input
и подписаться на разные данные @Output
на основе его экземпляра, например,
<ndc-dynamic *ngFor="let tab of tabs"
[ndcDynamicComponent]="component"
[ndcDynamicInputs]="inputs" <!-- this needs to be different for each tab-->
[ndcDynamicOutputs]="outputs"> <!-- this needs to be different for each tab-->
</ndc-dynamic>
За исключением повреждения моего объекта вкладки inputs
а также outputs
член или создание специального интерфейса, такого как:
interface DynamicTab {
tab: Tab,
inputs: any,
outputs: any
}
Есть идеи, как реализовать такое поведение? какой-то способ эффективно использовать *ngFor
и манипулировать основным inputs
с текущей вкладкой?
Я мог бы создать два метода для моего компонента для расчета необходимых входов и выходов, но все эти параметры кажутся слишком большими, чтобы манипулировать текущим tab
Данные, которые у меня уже есть во время работы с *ngFor
Заранее спасибо за любые идеи!
0 ответов
У меня есть следующее:
<mat-tab-group>
<mat-tab *ngFor="let tab of tabs" label="{{tab.label}}">
<ng-container *ngComponentOutlet="tab.component;injector:createInjector(tab.data)"></ng-container>
</mat-tab>
</mat-tab-group>
Вкладки - это объект массива с моим компонентом дифференциалов, каждый компонент помещается в каждую вкладку.
это моя модель о вкладке:
export interface CwcTabModel {
label?: string;
component?: any;
data?: CwcDataTab;
}
export class CwcDataTab {
data?: any;
}
CwcDataTab - это данные для отправки каждому компоненту, а с помощью инжектора - это когда передаются данные.
И теперь вы можете создать тестовый компонент, например:
TestTabOneComponent:
@Component({
selector: 'app-test-tab-one',
templateUrl: './test-tab-one.component.html',
styleUrls: ['./test-tab-one.component.scss']
})
export class TestTabOneComponent implements OnInit {
information: string;
constructor(private dataTab: CwcDataTab) {
if (this.dataTab !== undefined && this.dataTab.data !== undefined) {
this.information = this.dataTab.data;
}
}
}
Затем для использования вкладок компонента вы можете создать в каком-либо компоненте вкладки объекта:
tabs = [
{
label: 'TAB1',
component: TestTabOneComponent, /* it will be a dynamic component, but data should be different*/
data: {
data: 'value1 valor distinto, mismo componente'
}
},
{
label: 'TAB2',
component: TestTabOneComponent, /* it will be a dynamic component, but data should be different*/
data: {
data: 'value2 valor distinto, mismo componente'
}
},
{
label: 'TAB3',
component: TestTabOneComponent, /* it will be a dynamic component, but data should be different*/
data: {
data: 'value3 valor distinto, mismo componente'
}
}
];
И на каждой вкладке используется один и тот же компонент (может быть общим компонентом), и в каждом компоненте вы можете видеть разные данные. извините мой английский, я надеюсь, что вы можете использовать это.