javascript - 如何将 ElementRef 添加到本地 dom 中?

标签 javascript angular angularjs-ng-transclude transclusion

我想创建一个布局组件来排列项目组,例如:

<garden-bed>
  <div #veg (click)="pluck()">carrot</div>
  <div #veg (click)="pluck()">cabbage</div>
  <div #veg (click)="pluck()">turnip</div>
</garden-bed>

到目前为止该组件看起来像

@Component({
  selector: 'app-garden-bed',
  templateUrl: './garden-bed.component.html',
})
export class GardenBed  {

  @ContentChildren('veg') vegs: QueryList<ElementRef>;

  constructor() { }


  ngAfterViewInit() {
    console.log('this.vegs=' + JSON.stringify(this.vegs));
  }

}

但我不知道如何将它们种植在模板中(garden-bed.component.html):

  <div *ngFor="let veg of vegs">
     <ng-content/ng-template  *something="veg"></ng-template>
     but this doesn't work.
     veg should appear here and all its binding should work!

  </div>

非常感谢任何帮助!

最佳答案

为了避免更改检测出现问题,您应该从 QueryList 中获取 templateRefs使用toArray仅一次:

  templates: TemplateRef[];

  ngAfterViewInit() {
    console.log('this.vegs=' + JSON.stringify(this.vegs));
    this.templates = this.vegs.toArray();
  }

然后使用ngTemplateOutlet标记模板

  <div *ngFor="let veg of templates">
     <ng-container *ngTemplateOutlet="veg"></ng-container>
     but this doesn't work.
     veg should appear here and all its binding should work!

  </div>

ngTemplateOutlet还允许传递可以绑定(bind)到模板中的上下文数据

另请参阅

不要对 <ng-template [ngTemplateOutlet]="myTemplate" 感到困惑,这只是我上面展示的替代语法

关于javascript - 如何将 ElementRef 添加到本地 dom 中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48828774/

相关文章:

javascript - 用于 DOM 操作的原型(prototype)或 jQuery(客户端动态内容)

css - Angular 应用程序样式化 unicode 字符

javascript - 如何以 Angular 实现socket.io

angularjs - 嵌入指令和表格

angularjs - 指令链接函数的transclude函数中, "futureParentElement"是怎么用的?

angularjs - $element.append() 嵌入时不追加

javascript - Angular 响应正文返回带有 JSON 括号的文本条纹。啊?

javascript - 如何构建与溢出 : auto? 一起使用的可调整大小的 DIV

javascript - iFrame window.postMessage - 数据始终为空字符串

angular - ngx-bootstrap Bootstrap4 : after closing modal is still there