单击行后插入动态创建组件

Posted

技术标签:

【中文标题】单击行后插入动态创建组件【英文标题】:Insert dynamically create component after clicked row 【发布时间】:2019-03-03 07:14:08 【问题描述】:

我正在研究解决方案,我想在单击行后附加动态创建的组件

我的表格由带有点击操作按钮的行组成,我将在该行之后调用角度函数并加载组件。

这是表格代码

<div class="row" *ngFor="let rData of reportData; let i = index;" >
        <div class="col" >
            <button class="btn btn-sm" (click)="loadChildComponent()">+</button>
        </div>
        <div class="col">Name</div>
        <div class="col">Description</div>
        <ng-template #dynamic></ng-template>

</div>

动态组件代码

Service.ts


import  DynamicComponent  from './dynamic.component'
@Injectable()
export class Service 
  factoryResolver;
  rootViewContainer; 
  constructor(@Inject(ComponentFactoryResolver) factoryResolver) 
    this.factoryResolver = factoryResolver
  
  setRootViewContainerRef(viewContainerRef) 
    this.rootViewContainer = viewContainerRef
  
  addDynamicComponent() 
    const factory = this.factoryResolver
                        .resolveComponentFactory(DynamicComponent)

    const component = factory
      .create(this.rootViewContainer.parentInjector)

    this.rootViewContainer.insert(component.hostView)
  

这是组件文件。

dynamic.component.ts

import  Component  from '@angular/core'
@Component(
  selector: 'dynamic-component',
  template: `<div class="row"  >
            <div class="col">Data</div>
            <div class="col">Data</div>
            <div class="col">Data</div>
            <div class="col">Data</div>
            <div class="col">Data</div>
            <div class="col">Data</div>
            <div class="col">Data</div>
    <ng-template #dynamic></ng-template>
    </div>`
)
export class DynamicComponent  

用于渲染动态组件的函数

@ViewChild('dynamic',  
      read: ViewContainerRef 
    ) viewContainerRef: ViewContainerRef

loadChildComponent() 
        this.service.setRootViewContainerRef(this.viewContainerRef)
        this.service.addDynamicComponent()
    

现在它附加在任何行的相同 div 中

我想在点击行后追加它

请帮忙..

【问题讨论】:

据我了解,你可以得到动态模板,但它不是单独显示的,对吧? 【参考方案1】:

Angular 中的ng-template 就像一个幽灵元素,即它永远不会直接显示。检查这个link。

更新:

因为您使用了@ViewChild,所以您总是将模板插入第一行。 @ViewChild 查找模板中的第一个元素。

尝试改用@ViewChildren

请参阅以下更改:

<ng-container *ngFor="let rData of reportData; let i = index;">
    <div class="row">
        <div class="col" >
            <button class="btn btn-sm" (click)="loadChildComponent(i)">+</button>
        </div>
        <div class="col">Name</div>
        <div class="col">Description</div>

    </div>
    <div class="row">
        <ng-template #dynamic></ng-template>
    </div>
</ng-container>

JS 变化:

@ViewChildren('dynamic',  read: ViewContainerRef ) viewContainerRef: QueryList<ViewContainerRef>

loadChildComponent(index) 
        this.service.setRootViewContainerRef(this.viewContainerRef.toArray()[index])
        this.service.addDynamicComponent()
    

希望这会有所帮助:)

【讨论】:

我会努力实现的! 我的问题是这个组件总是附加在相同的位置,而不是各自点击的行 不,这不再起作用问题是新加载的内容附加在同一个地方,我想要实现的是,假设如果我点击第一行,则根据报告数据绘制 10 行,动态组件应该出现在第一行之后,如果我点击第 8 行,组件应该再次出现在第 8 行之后。现在它被添加到同一个地方而不考虑点击的行 @RipulChhabra 检查更新的答案。我希望这会有所帮助。 是的,对我来说几乎没有什么变化 @ViewChildren('dynamic', read: ViewContainerRef ) viewContainerRef: QueryList

以上是关于单击行后插入动态创建组件的主要内容,如果未能解决你的问题,请参考以下文章

创建动态组件 VUE

如何创建动态的 React Native 组件

单击列表末尾的图标删除动态创建的 <li> 列表项

如何在单击 PHP 中的按钮时动态插入列表框?

Angular 7 - 向动态创建的组件添加拖放行为

*ngFor 动态创建的表单组件在表单控件中保持价值