【问题标题】:How to Add ElementRef into local dom?如何将 ElementRef 添加到本地 dom 中?
【发布时间】:2018-07-27 11:32:35
【问题描述】:

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

<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>

非常感谢任何帮助!

【问题讨论】:

    标签: javascript angular angularjs-ng-transclude transclusion


    【解决方案1】:

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

      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 还允许传递可以在模板中绑定的上下文数据

    另见

    不要被&lt;ng-template [ngTemplateOutlet]="myTemplate" 弄糊涂了,它只是我上面显示的替代语法

    【讨论】:

    • 谢谢,它有效! +
    猜你喜欢
    • 2018-11-02
    • 2015-02-20
    • 2018-03-30
    • 2013-09-18
    • 1970-01-01
    • 1970-01-01
    • 2021-10-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多