javascript - 使用指令将组件动态添加到子元素

标签 javascript angular typescript components angular2-directives

尝试使用指令将组件动态放置到子元素。

组件(作为模板):

@Component({
  selector: 'ps-tooltip',
  template: `
    <div class="ps-tooltip">
      <div class="ps-tooltip-content">
        <span>{{content}}</span>
      </div>
    </div>
  `
})
export class TooltipComponent {

  @Input()
  content: string;

}

指令:

import { TooltipComponent } from './tooltip.component';

@Directive({
  selector: '[ps-tooltip]',
})
export class TooltipDirective implements AfterViewInit {

  @Input('ps-tooltip') content: string;

  private tooltip: ComponentRef<TooltipComponent>;

  constructor(
      private viewContainerRef: ViewContainerRef,
      private resolver: ComponentFactoryResolver,
      private elRef: ElementRef,
      private renderer: Renderer
  ) { }

  ngAfterViewInit() {
    // add trigger class to el
    this.renderer.setElementClass(this.elRef.nativeElement, 'ps-tooltip-trigger', true); // ok

    // factory comp resolver
    let factory = this.resolver.resolveComponentFactory(TooltipComponent);

    // create component
    this.tooltip = this.viewContainerRef.createComponent(factory);
    console.log(this.tooltip);

    // set content of the component
    this.tooltip.instance.content = this.content as string;
  }
}

问题是这是在创建 sibling ,我想要一个 child (见下文)

结果:

<a class="ps-btn ps-tooltip-trigger" ng-reflect-content="the tooltip">
  <span>Button</span>
</a>
<ps-tooltip>...</ps-tooltip>

想要的结果:

<a class="ps-btn ps-tooltip-trigger" ng-reflect-content="the tooltip">
  <span>Button</span>
  <ps-tooltip>...</ps-tooltip>
</a>

预先感谢您的帮助!

最佳答案

即使动态组件作为同级元素插入,您仍然可以使用以下方法将元素移动到所需位置:

this.elRef.nativeElement.appendChild(this.tooltip.location.nativeElement);

Plunker Example

关于javascript - 使用指令将组件动态添加到子元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42598169/

相关文章:

javascript - Array Push 在 JavaScript 中对相同的值使用相同的索引

javascript - 在 Cytoscape.js 中拖动节点时使其他节点跟随

javascript - 如何在 Angular 6 中格式化日期?

javascript - ngFor 中的复选框,每次单击任何其他复选框时,只有第一个复选框被选中和取消选中

javascript - 使用自定义按钮控制Soundcloud HTML5 Widget Player

javascript - couchdb 中 "_id"上的索引默认存在?

angular - 显示 mat-select 的 ngModel 值

javascript - 如何将变量更改为数组中的下一个字符串

typescript - 如何获取嵌套对象的类型推断?

angular - @angular 或@types 中的 ‘@’ 符号后面是什么?