nz-zorro service方式modal拖拽

nz-zorro 通过服务创建modal弹窗拖拽

最近的一个新需求就是需要把ant-design-angular的弹窗实现拖拽,我们当初写的时候都是用service注入的方式来实现弹窗,在网上找成品轮子时发现都是针对使用非服务方式创建的(给标签添加指令),记录一下实现方式。

中心的实现思想就是利用服务把事件绑定在modal的header上,通过控制’mousedowm’,‘mouseup’,‘mousemove’,来实现拖拽。

具体实现如下:

import {injectable, RendererFactory2} from '@angular/core'
@injectable({
	procidedIn: 'root'
})
export class ModalDragService {

	constractor(
		private rendererFactory2: RendererFactory2
	){}
	
	setModalElement(refModal) {
		const render = this.rendererFactory2.createRender(null, null);
		const modal = refModal.elementRef.nativeElement;
		const modalElement = refmodal.elementRef.nativeElement.querySelector('.ant-modal-content');
		const modalTitleElement = this.getModalTitleElement(render, modalElement);
		this.dragListen(render, modalTitleElement, modalElement, modal);
	}
	
	getModalTitleElement(render, modalElement) {
		let element = document.createElement('div') as any;
		render.setStyle(element, 'width', '100%');
		render.setStyle(element, 'height', '40px');
		render.setStyle(element, 'position', 'absolute');
		render.setStyle(element, 'top', '0');
		render.setStyle(element, 'left', '0');
		render.appendChild(modalElement, element);
		return element;
	}

	dragListen(render, modalTitleElement, modalElement, modal) {
		render.listen(modalTitleElement, 'mousedown', function(event){
			this.mouseDownX = event.clientX;
			this.mouseDownY = event.clientY;
			this.modalX = modalElement.offsetLeft;
			this.modalY = modalElement.offsetTop;
			render.setStyle(modalElement, 'left', `${this.modalX}px`);
			render.setStyle(modalElement, 'top', `${this.modalY}px`);
			this.canMove = true;
		}.bind(this));
		render.listen(modalTitleElement, 'mouseup', function(event){
			this.canMove = false;
		}.bind(this));
		render.listen(modal, 'mousemove', function(event){
			if (this.canMove){
				let moveX = event.ClientX - this.mouseDownX;
				let moveY = event.clientY - this.mouseDownY;
				let newModalX = this.modalX + moveX;
				let newModalY = this.modalY + moveY;
				render.setStyle(modalElement, 'top', `${newModalX}px`);
				render.setSty;e(modalElement, 'left', `${newModalY}px`);
			}
		}.bind(this));
	}
}
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 5
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值