#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
fromrxjs
, чтобы вставить новое значение внутрь и подписаться на него. Если вы не знаете, что это такое, я настоятельно рекомендую вам взглянуть на это, это довольно полезно 🙂3. Спасибо, я сделал это, и это работает 🙂 ! но есть еще последняя проблема: я использую больше элементов в div с ngfor, я получаю только позицию первого элемента, а не второго .. у вас есть какие-либо предложения?
4. @freeprogramming Я отредактировал свой код, чтобы использовать
mouseup
событие для получения текущего элемента и его данных. Теперь я настоятельно рекомендую вам научиться использовать CdkDrag, это довольно полезно 🙂 Подумайте о том, чтобы пометить этот ответ как правильный ответ и проголосовать за него, если он вас удовлетворяет 🙂