gpt4 book ai didi

angular - 如何使用 ng2-dragula 和 Angular 元素调整器

转载 作者:行者123 更新时间:2023-12-04 01:47:26 27 4
gpt4 key购买 nike

我正在使用 Dragula 在我的 table 上拖放。此外,我正在使用插件 angular resizier 元素来调整表格列的大小。所有这些我一直在 Angular2 中工作。

所以我想要的是这个。我目前的情况就像图像上的这个灰色列。整个列宽是可拖动的,这让我在调整列大小时遇到​​了问题。因此,当我尝试调整列的大小时,它就像拖放一样。我希望我的柱子像这个黄色的柱子。有一些调整大小的空间。

这里是我的html代码的一部分:

<div class="row" [dragula]='"one-bag"' [dragulaModel]='names'>
<div class="col" *ngFor="let name of names"
mwlResizable
[validateResize]="validate"
[resizeEdges]="{right: true}"
[enableGhostResize]="false">
<label>{{name}}</label>
</div>
</div>

这是我一直在使用的调整器。
https://github.com/mattlewis92/angular-resizable-element

问题:如何在同一个表列上使用 ng2-dragula 和调整大小?

最佳答案

我自己也遇到了同样的问题,但是使用 ngDraggable 而不是 dragula ......

我想到的唯一解决方案是为两者设置处理程序,例如为可调整大小的模块设置 mwlResizeableHandler HTMLElement,为 ngDraggable 模块设置另一个处理程序,停止在两者上传播点击事件并强制它们更新组件中的相同样式对象,然后与 ngStyle 一起传递给元素以确定它在浏览器上的位置。

我认为问题的根源在于 ngDraggable 实现了 转换:翻译(x,y)而 resizeable 指的是一个样式对象,意思是顶部/左侧定位。

我还没有实现该解决方案,但是一旦我在代码中配置它,我将发布更新。

编辑/更新 :

好吧,我所做的是实现我自己的可拖动函数,从长远来看,这被证明更容易。
这是我的可调整大小:

<div @fade id="{{index}}" class="box" [ngStyle]="style"
mwlResizable
[validateResize]="validate"
[resizeCursorPrecision]="resizeCursor"
[enableGhostResize]="true"
[ghostElementPositioning]="style.position"
(resizeEnd)="onResizeEnd($event)"
(click)="setSelected($event)"
[ngClass]="{selected : selected}">
<div
style="cursor: move; height: 50px; width: 50px; border: 2px solid black; background-color: green;"
(mousedown)="onMouseDown($event)"
(mousemove)="onMove($event)"
(mouseup)="finalPosition($event)"
(mouseleave)="finalPosition($event)">
</div>
<img class="resize-handle-top-left"
mwlResizeHandle
[resizeEdges]="{top: true, left: true}"
src="http://i.imgur.com/eqzz2dl.gif">
<img class="resize-handle-top-right"
mwlResizeHandle
[resizeEdges]="{top: true, right: true}"
src="http://i.imgur.com/eqzz2dl.gif">
<img class="resize-handle-bottom-left"
mwlResizeHandle
[resizeEdges]="{bottom: true, left: true}"
src="http://i.imgur.com/eqzz2dl.gif">
<img class="resize-handle-bottom-right"
mwlResizeHandle
[resizeEdges]="{bottom: true, right: true}"
src="http://i.imgur.com/eqzz2dl.gif">
</div>
</div>

实现调整大小的代码:

public onResizeEnd(event: ResizeEvent): void {
this.style = {
position: 'absolute',
left: `${event.rectangle.left}px`,
right: `${event.rectangle.right}px`,
top: `${event.rectangle.top}px`,
bottom: `${event.rectangle.bottom}px`,
width: `${event.rectangle.width}px`,
height: `${event.rectangle.height}px`
};

所以我所做的只是在 div 中间的一个临时框,并在其上设置了一些事件监听器,mousedown、mousemove、mouseup。 checkBoundaries 函数只是用来检查拖动是否不超过父 DIV 限制:

checkBoundariesLeft(styleAttr: number, tempMove: number): number {
if ((styleAttr + tempMove) > 0 && (styleAttr + tempMove) < (this.api.imageW - Number.parseInt(this.style.width))) {
this.previousLeft = (styleAttr + tempMove);
return this.previousLeft;
}
return this.previousLeft;
}
checkBoundariesRight(styleAttr: number, tempMove: number): number {
if ((styleAttr + tempMove) > Number.parseInt(this.style.width) && (styleAttr + tempMove) < this.api.imageW) {
this.previousRight = (styleAttr + tempMove);
return this.previousRight;
}
return this.previousRight;
}

checkBoundariesTop(styleAttr: number, tempMove: number): number {
if ((styleAttr + tempMove) > 0 && (styleAttr + tempMove) < (this.api.imageH - Number.parseInt(this.style.height))) {
this.previousTop = (styleAttr + tempMove);
return this.previousTop;
}
return this.previousTop;
}

checkBoundariesBottom(styleAttr: number, tempMove: number): number {
if ((styleAttr + tempMove) > Number.parseInt(this.style.height) && (styleAttr + tempMove) < this.api.imageH) {
this.previousBottom = (styleAttr + tempMove);
return this.previousBottom;
}
return this.previousBottom;
}

public onMouseDown(event: MouseEvent): void {
event.stopPropagation();
this.moveElementInitiated = true;
this.tempCoords = {
left : event.offsetX,
top : event.offsetY
};
}

public onMove(event: MouseEvent): void {
if (this.moveElementInitiated) {
const tempLeft = (event.offsetX - this.tempCoords.left) / this.ratio;
const tempTop = (event.offsetY - this.tempCoords.top) / this.ratio;
this.style = {
position: 'absolute',
left: `${this.checkBoundariesLeft(Number.parseInt(this.style.left), tempLeft)}px`,
right: `${this.checkBoundariesRight(Number.parseInt(this.style.right), tempLeft)}px`,
top: `${this.checkBoundariesTop(Number.parseInt(this.style.top), tempTop)}px`,
bottom: `${this.checkBoundariesBottom(Number.parseInt(this.style.bottom), tempTop)}px`,
width: this.style.width,
height: this.style.height
};
}
}

public finalPosition(event): void {
this.moveElementInitiated = false;
}

我应该注意所有功能更新 组件内的相同样式对象 .

关于angular - 如何使用 ng2-dragula 和 Angular 元素调整器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44241703/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com