将#element绑定到使用* ngFor

时间:2017-10-31 11:16:38

标签: angular viewchild

我正在使用* ngFor来创建一堆div。我想抓住其中一个来获得它的宽度。

.html
<div #elReference *ngFor="let el of elements> HEHE </div>

.ts
  @ViewChild("elReference") elReference: ElementRef;

显然,您不能将ViewChild与* ngFor一起使用,因为elReference仍未定义。

如何使用* ngFor?

创建元素引用

2 个答案:

答案 0 :(得分:4)

无法有选择地添加模板变量, 但您可以选择性地添加标记,然后按以下方式过滤:

<div #elReference [attr.foo]="el.x == 'foo' ? true : null" *ngFor="let el of elements> HEHE </div>
@ViewChildren("elReference") elReference: QueryList<ElementRef>;

ngAfterViewInit() {
  console.log(this.elReference.toArray()
      .filter(r => r.nativeElement.hasAttribute('foo')));
}

答案 1 :(得分:2)

有一种更复杂但更正确的指令方式。

<!-- app.component.html -->
<div *ngFor="let el of elements" [id]="el.id"> HEHE </div>
// div-id.directive.ts
import { Directive, Input, ElementRef } from '@angular/core';

@Directive({
  selector: 'div[id]',
})
export class DivIdDirective {
  @Input() id: number;

  constructor(ref: ElementRef<HTMLDivElement>) {
    this.el = ref.nativeElement;
  }

  el: HTMLDivElement;
}

// app.component.ts
export class AppComponent implements AfterViewInit {
  // ...
  @ViewChildren(DivIdDirective) els: QueryList<DivIdDirective>;

  ngAfterViewInit(): void {
    console.log(this.els.map(({id, el}) => ({id, el}));
  }
}