我使用Dragula拖放我的桌子。我还使用插件角度resizier元素来调整表格列的大小。所有这些我一直在Angular2工作。
所以我想要的就是这个。我目前的情况就像图像上的灰色列。整列宽度是可拖动的,这在调整列大小时会出现问题。因此,当我尝试调整列的大小时,它就像拖放一样。我希望我的colum就像这个黄色的那个。要有一些空间来调整大小。
这是我的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和resizer?
答案 0 :(得分:0)
我自己也遇到过同样的问题,但是使用ngDraggable而不是拖拉...
我想到的唯一解决方案是为两者设置Handlers,例如可调整大小的模块的mwlResizeableHandler HTMLElement和ngDraggable模块的另一个,停止在两者上传播click事件并强制它们更新Component中的相同Style对象,然后将其与ngStyle一起传递给元素,以确定它在浏览器上的位置。
我认为问题的根源是ngDraggable实现了一个转换:translate(x,y),而resizeable引用了一个Styles对象,意思是上/左定位。
我还没有实现解决方案,但是一旦我在代码中配置它,我将发布更新。
修改/更新强>:
好吧,我所做的是实现我自己的可拖动功能,从长远来看,这更容易实现。 这是我的可调整大小:<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;
}
我应该注意所有功能更新组件中相同的样式对象。