Есть ли способ получить положение элемента в Angular 8?

#html #css #angular #typescript

#HTML #css #angular #typescript

Вопрос:

У меня проблема: я хочу получить положение элемента в виде значений. Например, x = 10 и y = 30. После этого я хочу использовать их для обновления положения элемента в следующий раз. Как и прежде, элемент A находился в позиции x = 5 и y = 5. Затем я перетаскиваю позицию и получаю позиции x = 10 и y = 30. Затем я устанавливаю позицию в следующий раз и обновляю позицию. Пожалуйста, помогите!

Комментарии:

1. Вы можете получить положение элемента, используя обычный JS. Для этого есть несколько способов. Например. с помощью Element.getBoundingClientRect(). docs

Ответ №1:

Вот пример использования getBoundingClientRect() Stackblitz для получения всех необходимых данных, и вот код:

.ts :

 import {
  Component,
  ElementRef,
  ViewChild,
  AfterViewInit,
  AfterContentChecked,
AfterViewChecked
} from "@angular/core";

/**
 * @title Basic Dragamp;Drop
 */
@Component({
  selector: "cdk-drag-drop-overview-example",
  templateUrl: "cdk-drag-drop-overview-example.html",
  styleUrls: ["cdk-drag-drop-overview-example.css"]
})
export class CdkDragDropOverviewExample implements AfterViewChecked {
  @ViewChild("block") block: ElementRef;

  constructor() {}
  
  ngAfterViewChecked() {
    let datas = this.block.nativeElement.getBoundingClientRect();
    console.log("datas = ", datas);
  }

  onDrop(item: any) {
    console.log("item = ", item.target.getBoundingClientRect());
  }
}
  

.html :

 <div class="example-box" cdkDrag #block (mouseup)="onDrop($event)">
  Drag me around
</div>
  

.css :

 .example-box {
  width: 200px;
  height: 200px;
  border: solid 1px #ccc;
}
  

Обратите внимание, что для этого используется cdkDrasg из Angular (я привел пример из stackblitz документации), поэтому вам нужно будет немного адаптироваться, если вы используете что-то другое для функции перетаскивания.

Кроме того, планируете ли вы редактировать положение вручную (с помощью typescript), рассмотрите возможность использования Renderer2 вместо непосредственного использования ViewChild.

Комментарии:

1. большое вам спасибо за ответ!!! 🙂 да, я использую cdkdrag. Но проблема в том, что теперь я получаю правильные значения на консоли, но мне нужны они, например, в переменной. Вы знаете как?

2. @freeprogramming Всегда пожалуйста. Чтобы получить значения в vraible, вы можете просто объявить новое значение в ViewChild в моем примере и установить его при обновлении значений. Если вам нужно отреагировать на изменения, вы можете использовать BehaviorSubject from rxjs , чтобы вставить новое значение внутрь и подписаться на него. Если вы не знаете, что это такое, я настоятельно рекомендую вам взглянуть на это, это довольно полезно 🙂

3. Спасибо, я сделал это, и это работает 🙂 ! но есть еще последняя проблема: я использую больше элементов в div с ngfor, я получаю только позицию первого элемента, а не второго .. у вас есть какие-либо предложения?

4. @freeprogramming Я отредактировал свой код, чтобы использовать mouseup событие для получения текущего элемента и его данных. Теперь я настоятельно рекомендую вам научиться использовать CdkDrag, это довольно полезно 🙂 Подумайте о том, чтобы пометить этот ответ как правильный ответ и проголосовать за него, если он вас удовлетворяет 🙂