如何在Angular2中获取(DOM)元素的宽度

kke*_*ern 28 javascript angular2-directives angular

有一些类似的线程,但我找不到合适的答案满足我的需求.所以在angular2中应该严格避免直接DOM访问我只是想知道最新的做法.

我想要实现的是基于当前宽度调整元素的大小.

workitemresize.component.ts

import { Directive, ElementRef, HostListener, Renderer, Input } from '@angular/core';

@Directive({
  selector: '[workItemResize]'
})

export class WorkItemResizeDirective implements ngAfterViewInit {

  private el: HTMLElement;
  private renderer: Renderer;

  constructor(el: ElementRef, public renderer: Renderer)
  { 
    this.el = el.nativeElement; 
    this.renderer = renderer;
  }  


  @HostListener('window:resize', ['$event.target']) 
  onResize() 
  { 
    this.resizeWorks();
  }

  ngAfterViewInit() {
    this.resizeWorks();
  }

  private resizeWorks(): void {
    this.renderer.setElementStyle(this.el, 'height', this.el.width); // <-- doesn't work I kow that this.el.width doesn't exist but just for demonstration purpose
    this.renderer.setElementStyle(this.el, 'height', '500'); // <-- works
  }

}
Run Code Online (Sandbox Code Playgroud)

projects.template.html

<div class="posts row">
        <div class="work-item col-xs-12 col-sm-6 col-no-padding"  workItemResize *ngFor="let post of posts">

                <!-- show some fancy image -->
                <div class="img"  [ngStyle]="{'background-image':'url('+post.better_featured_image.source_url+')'}"></div>

        </div>
</div>
Run Code Online (Sandbox Code Playgroud)

相关:https: //github.com/angular/angular/issues/6515

Gün*_*uer 17

我不知道如何在不访问的情况下从主机元素获取宽度,nativeElement但设置可以像:

@HostListener('window:resize', ['$event.target']) 
onResize() { 
  this.resizeWorks();
}

@HostBinding('style.height.px')
elHeight:number;

private resizeWorks(): void {
  this.elHeight = this.el.nativeElement.width;
}
Run Code Online (Sandbox Code Playgroud)

如果您可以在组件模板中添加元素,例如

<div style="width: 100%;" #div (window:resize)="elHeight = div.getBoundingClientRect()">
  <!-- your template here -->
</div>
Run Code Online (Sandbox Code Playgroud)

那么这可以在没有直接DOM访问的情况下工作(但不能在init之后).


Ima*_*ovs 9

我尝试了@GünterZöchbauer解决方案并对其进行了改进.您不需要HostListener来获取div的边界.与'click'或其他事件(event)="function()"一样,它将触发此函数.我希望有人会觉得这很有帮助.

<div #div (window:resize)="onResize(div.getBoundingClientRect())">
   <!-- your template here -->
</div>


onResize() { 
   this.resizeWorks();
}

@HostBinding('style.height.px') elHeight:number;

private resizeWorks(): void {
   this.elHeight = this.el.nativeElement.width;
}
Run Code Online (Sandbox Code Playgroud)

(#div) - 这是获得测量目标所需的变量.它不必与元素同名,也可以是任何名称.

获取元素维度的另一种方法是使用Angular Core中的ElementRef类,但是您必须找到具有width和height属性的子元素.我在Angular 2 Maps中使用它来获取容器的宽度和高度,但我发现,使用这种方法我必须在具有这些属性的元素树元素中找到它并且它是根元素的第二个子元素.它更乱.ElementDimensions - 只是一个高度和宽度的类,我用它来包含这些属性.

<div (window:resize)="onResize()">
   <!-- your template here -->
</div>

private getContainerDimensions(): ElementDimensions{
    var rootElement = this.elementRef.nativeElement;
    var childElement = rootElement.firstElementChild;
    var contentElement =  childElement.firstElementChild;

    return {
        height:contentElement.clientHeight,
        width: contentElement.clientWidth
    };
}
Run Code Online (Sandbox Code Playgroud)


Cha*_*ton 7

我以这种方式进行了测试并且简单地工作!似乎绑定完成了这项工作。

<div #foto [style.height.px]="foto.getBoundingClientRect().width / 2">
Run Code Online (Sandbox Code Playgroud)

  • 这是可行的,但 Angular 的更改检测将使浏览器在每次检测到更改时运行“getBoundingClientRect”方法。除非您特别希望以这种方式更新该 div 的样式,否则您应该将该宽度存储在 .ts 文件中,并仅在需要时更新它。 (3认同)