angular - 如何从 Angular 2 中的指令附加动态 DOM 元素?

标签 angular angular2-directives

我有一个附加元素的 Angular 1.x 指令。简而言之:

app.directive('mydirective', function() {
  template: '<ng-transclude></ng-transclude>',
  link: function(el) {
    var child = angular.element("<div/>");
    el.append(child);
  }

我可以像这样将此指令迁移到 Angular 2:

@Directive({
  selector: '[mydirective']
})
export class MyDirective implements OnInit {
  constructor(private elementRef: ElementRef) { }

  ngOnit() {
    var child = angular.element("<div/>");
    this.elementRef.nativeElement.append(child);
  }
}

困扰我的是nativeElement官方文档中的这段话:

Use this API as the last resource when direct access to DOM is needed.

我的问题是——我怎样才能正确地将这个指令迁移到 Angular 2?我唯一的要求是动态构建一个元素并使用指令将其附加到该元素。

最佳答案

使用Renderer Angular 提供的操作 DOM 的方法:

import { DOCUMENT } from '@angular/common';

export class MyDirective implements OnInit {
  constructor(
    private elementRef: ElementRef,
    private renderer: Renderer2,
    @Inject(DOCUMENT) private document: Document) { }

  ngOnInit() {
    const child = this.document.createElement('div');
    this.renderer.appendChild(this.elementRef.nativeElement, child);
  }
}

这不依赖于像 appendChild() 这样的原生 DOM API,所以在某种程度上它是一种独立于平台的方法。

关于angular - 如何从 Angular 2 中的指令附加动态 DOM 元素?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45085567/

相关文章:

angular - 从指令动态附加子项

javascript - Ionic2:当你来到页面时,你如何选择要关注的输入?

angular - Cordova AppCenter 插件 : Query fired: did not receive both families in time for in. appcenter.ms:443

angular - 使用服务器端数据源时,标题复选框的选择不起作用

angular - 如何在 Angular 2 中将对象从一个组件传递到另一个组件?

Angular2 仅当特定值或 bool 值为真时才使用排序管道

angular - 如何在 Angular 2 中包含 JQuery 插件?

angular - 使用 NgbModal 服务时如何测试模态内容

javascript - 如何在 Angular 类中表示嵌套的 JSON?

angular - Jhipster下载过程中如何更改文件名(java + angular)