Подтвердить что ты не робот

Получение высоты элемента

Мне было любопытно, могу ли я получить свойства элемента из шаблона компонента. Поэтому я сделал простой div с классом, и я сделал этот класс:

export class viewApp{

  elementView: any;
  viewHeight: number;
  myDOM: Object;

  constructor() {
    this.myDOM = new BrowserDomAdapter();
  }

  clickMe(){
    this.elementView = this.myDOM.query('div.view-main-screen');
    this.viewHeight = this.myDOM.getStyle(this.elementView, 'height');
  }
}

getStyle(), query() взяты из BrowserDomAdapter. Моя проблема в том, что когда я пытаюсь получить высоту, это null, но когда я устанавливаю некоторую высоту на setStyle(), а затем получаю ее с помощью getStyle(), она возвращает правильное значение. После проверки DOM и стилей в браузере я обнаружил, что это связано с двумя элементами CSS. Один из них: .view-main-screen[_ngcontent-aer-1]{}, а второй - element{}. .view-main-screen имеет несколько стилей, но элемент пуст. Когда я добавляю стили setStyle(), он появляется в element{}. Почему это? Как получить свойства элемента с помощью Angular2?

4b9b3361

Ответ 1

Правильный способ - использовать @ViewChild() decorator:

https://angular.io/docs/ts/latest/api/core/index/ViewChild-decorator.html

Шаблон:

<div class="view-main-screen" #mainScreen></div>

компонент:

import { ElementRef, ViewChild } from '@angular/core';

export class viewApp{

      @ViewChild('mainScreen') elementView: ElementRef;
      viewHeight: number;

      constructor() {
      }

      clickMe(){
        this.viewHeight = this.elementView.nativeElement.offsetHeight;
      }
}

Это должно сделать это, но, очевидно, вам нужно добавить декоратор Component.

Ответ 2

Update2

constructor(private elementRef:ElementRef) {}

someMethod() {
   console.log(this.elementRef.nativeElement.offsetHeight);
}

Доступ к nativeElement напрямую не рекомендуется, но текущий Angular не предоставляет других способов, насколько мне известно.

Обновление

https://github.com/angular/angular/pull/8452#issuecomment-220460761

mhevery прокомментировал 12 дней назад Мы решили удалить службу Ruler, и поэтому она не является частью публичного API.

оригинальный

Насколько я знаю, класс Ruler должен обеспечивать эту функциональность https://github.com/angular/angular/blob/master/modules/angular2/src/platform/browser/ruler.ts, если этого недостаточно, вам, вероятно, нужно получить доступ к elementRef.nativeElement и использовать прямой доступ DOM и функции, предоставляемые элементами.

new Ruler(DOM).measure(this.elRef).then((rect: any) => {
});

Служба правил безопасна в WebWorker. См. Также комментарии https://github.com/angular/angular/issues/6515#issuecomment-173353649

Ответ 3

<div *ngFor="let item of items" (click)="itemClick($event.currentTarget)"></div>

itemClick(dom){
  var height=dom.clientHeight;
  // ...
}