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

I am trying to get the index of a dynamically created ponent inside ViewContainerRefI need to get the i

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

发布者:admin,转转请注明出处:http://www.yc00.com/questions/1745106057a4611562.html

相关推荐

发表回复

评论列表(0条)

  • 暂无评论

联系我们

400-800-8888

在线咨询: QQ交谈

邮件:admin@example.com

工作时间:周一至周五,9:30-18:30,节假日休息

关注微信