Bowen
@Bowen
Японский бог

Как получить данные конкретного элемента на странице?

Здравствуйте.

Есть меню
<div class="menu__item"
      routerLinkActive #rla="routerLinkActive"
      [routerLinkActiveOptions]="{ exact: true }"
      *ngFor="let item of nav">
      <a routerLink="/{{ item.link }}" [ngClass]="{'menu__link': true, 'menu__link--active': rla.isActive}">
        <icon class="menu__icon" name="{{ item.icon }}"></icon>
      </a>
    </div>

Как можно получить ширину, высоту, отступы и прочее активной ссылки ?
  • Вопрос задан
  • 211 просмотров
Решения вопроса 1
0xD34F
@0xD34F
Сам элемент - с помощью ViewChild. Ну а дальше - getComputedStyle.
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
Bowen
@Bowen Автор вопроса
Японский бог
Можно еще так:
import { Directive, Output, ElementRef, EventEmitter,  ContentChildren } from '@angular/core';
import { NavigationEnd, Router, RouterLinkActive, RouterLinkWithHref } from '@angular/router';
import { Subscription } from 'rxjs';

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

export class ActiveRouteDirective {
  @ContentChildren(RouterLinkWithHref, { descendants: true }) linksWithHrefs;

  @Output('isActiveRouteEmitter') isActiveEmitter: EventEmitter<any> = new EventEmitter<any>();

  private subscription: Subscription;

  constructor(
    private router: Router, 
    private element: ElementRef
  ) {
    this.router = router;
    this.element = element;
    this.subscription = router.events.subscribe(s => {
        if (s instanceof NavigationEnd) {
          this.update();
        }
    });
  }

  ngAfterContentInit() {
    this.linksWithHrefs.changes.subscribe(() => this.update());
    this.update();
  }

  ngOnDestroy() {
    this.subscription.unsubscribe();
  }

  update() {
    if (!this.linksWithHrefs || !this.router.navigated) return;
    const isActive = this.linksWithHrefs.some(link => this.router.isActive(link.urlTree, true));
    if (isActive) {
      this.isActiveEmitter.emit(this.element.nativeElement);
    }
  }
}

HTML код
<div class="menu__item" #rla="routerLinkActive" routerLinkActive="menu__item--active" [routerLinkActiveOptions]="{ exact: true }" *ngFor="let item of menu">
    <a (isActiveRouteEmitter)="getParams($event)" routerLink="/{{ item.link }}" [ngClass]="{'menu__link': true, 'menu__link--active': rla.isActive}">
        {{ item.name }}
    </a>
</div>

Добавляем метод getParams в компонент
getParams($target){
  console.log($target.getBoundingClientRect());
}


Ссылка с рабочим примером
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы