最新消息:雨落星辰是一个专注网站SEO优化、网站SEO诊断、搜索引擎研究、网络营销推广、网站策划运营及站长类的自媒体原创博客

javascript - Angular, Get Index Of Dynamically Created Component Inside ViewContainerRef - Stack Overflow

programmeradmin13浏览0评论

I am trying to get the index of a dynamically created ponent inside ViewContainerRef

I need to get the index so I can destroy the ponent if I wanted too.

Code Below

@ViewChild('dynamicInsert', { read: ViewContainerRef }) dynamicInsert: ViewContainerRef

ponentFactory

constructor(
  private ponentFactoryResolver: ComponentFactoryResolver,
  private viewContainerRef: ViewContainerRef,
) { }

ngAfterViewInit() {
  thisponentFactory = thisponentFactoryResolver.resolveComponentFactory(AssetOptionComponent);
}

addAssetOption() {
  const dynamicComponent = <AssetOptionComponent>this.dynamicInsert.createComponent(thisponentFactory).instance
  // how to get index of this dynamically generated ponent ^^^^
}

Trying to use

this.dynamicInsert.remove(index: number) to destroy ponent

but I first need the index of the dynamically created ponent

this.dynamicInsert.indexOf(viewRef: viewRef)

I am trying to get the index of a dynamically created ponent inside ViewContainerRef

I need to get the index so I can destroy the ponent if I wanted too.

Code Below

@ViewChild('dynamicInsert', { read: ViewContainerRef }) dynamicInsert: ViewContainerRef

ponentFactory

constructor(
  private ponentFactoryResolver: ComponentFactoryResolver,
  private viewContainerRef: ViewContainerRef,
) { }

ngAfterViewInit() {
  this.ponentFactory = this.ponentFactoryResolver.resolveComponentFactory(AssetOptionComponent);
}

addAssetOption() {
  const dynamicComponent = <AssetOptionComponent>this.dynamicInsert.createComponent(this.ponentFactory).instance
  // how to get index of this dynamically generated ponent ^^^^
}

Trying to use

this.dynamicInsert.remove(index: number) to destroy ponent

but I first need the index of the dynamically created ponent

this.dynamicInsert.indexOf(viewRef: viewRef)

Share Improve this question asked Aug 28, 2017 at 18:50 locnguyenlocnguyen 8411 gold badge12 silver badges25 bronze badges
Add a ment  | 

2 Answers 2

Reset to default 6

To get the index you can use indexOf method and hostView property:

const index = this.dynamicInsert.indexOf(dynamicComponent.hostView)

Also note that if you don't specify the index view container will destroy the last ponent:

  remove(index?: number): void {
    const viewData = detachEmbeddedView(this._data, index);
    if (viewData) {
      Services.destroyView(viewData);
    }
  }

   export function detachEmbeddedView(elementData: ElementData, viewIndex?: number): ViewData|null {
  const embeddedViews = elementData.viewContainer !._embeddedViews;
     if (viewIndex == null || viewIndex >= embeddedViews.length) {
        viewIndex = embeddedViews.length - 1;
     }

So if you have only one ponent you don't need to pass index.

To remove all ponents you can use clear method.

If you are looking to destroy the created ponent you may consider a shortcut by just subscribing to it's observable destroy:

addAssetOption() {
   const dynamicComponent: ComponentRef<any> = this.dynamicInsert.createComponent(this.ponentFactory);
     dynamicComponent.instance.destroy.subscribe(() => dynamicComponent.destroy())
}

and then upon removing event, in AssetOptionComponent, call it:

 export class AssetOptionComponent  {
  destroy = new Destroyable();
  delete(){
    this.destroy.delete();
  }
}

export class Destroyable extends Subject<any>{
 delete() {
    this.next();
  } 
}

Working demo

与本文相关的文章

发布评论

评论列表(0)

  1. 暂无评论