日本免费高清视频-国产福利视频导航-黄色在线播放国产-天天操天天操天天操天天操|www.shdianci.com

學無先后,達者為師

網站首頁 編程語言 正文

ng-zorro中樹(nz-tree)的拖拽

作者:蒲公英 更新時間: 2022-01-09 編程語言

zorro的11版本
angular11版本

使用場景:
把已經組織好的菜單設置為可以拖拽排序。使用tree來完成這個功能

方法思路:
1、選擇正確的組件示例與方法
2、對拖拽前行為進行判斷,不合法的拖拽進行阻止
3、對獲取的數據進行處理,方便傳給后端
先分步實現,下面有完整代碼

1、選擇正確的組件示例與方法

使用這兩個tree示例(結合使用)
在這里插入圖片描述

在這里插入圖片描述

提示:第一個示例,無論調不調接口,都能完成視覺上的拖拽,并獲得拖拽前后的數據。第二個示例,拖拽前校驗,不符合條件的,阻止拖拽。這里兩個合用是的效果就是:滿足條件就有拖拽效果,不滿足條件,無法拖拽(不調用接口排序時)

怎么感覺不使用第二個也行呢,嗯!!!!!!!!

當我不使用拖拽前校驗(第二個)時,對拖拽前判斷時,不好判斷,還是使用吧
代碼:

 <nz-tree [nzData]="nodesTree" nzDraggable nzBlockNode 
		 (nzOnDrop)="nzEventTree($event)" 
		 [nzBeforeDrop]="beforeDrop"> 
 </nz-tree>

2、對拖拽前行為進行判斷,不合法的拖拽進行阻止

// 子等級與父等級級別不可以改變。只可以改變菜單的排列順序與位置
// 簡單來說就是,父級不能拖拽到其他父級的子級里。子級不能拖到外面成為父級。子級可以在不同的父級下拖拽排序。
// 這里有個特殊的就是:把子級拖拽到父級children=0下,這里不好判斷,我寫在了第三個if里,看客嗎有好的判斷方法的話,告訴我一下,感激不盡
nzEventTree(event: NzFormatEmitEvent | any): void | any {
	// this.cdr.markForCheck();
	console.log(event);
	if (event.node.level === 0 && event.dragNode.level === 0) {
	 return this.message.error('父級間移動');
	} else if (event.node.level === 1 && event.dragNode.level === 1) {
	  return this.message.error('子級間移動');
	} else if ( event.node.origin.children.length === 1 && event.dragNode.level === 1 && event.node.level === 0 ) {
	return this.message.error('將子級向空的目錄下移動');
	} else {
	  return this.message.error('不可移動');
	}
}-+



beforeDrop(arg: NzFormatBeforeDropEvent): any {
    // 要判斷是子級移動還是父級移動
    if (arg.node.level === 0 && arg.dragNode.level === 0 && arg.pos !== 0) {
      return of(true);
    } else if (arg.node.level === 1 && arg.dragNode.level === 1) {
      return of(true);
    } else if (arg.node.level === 0 && arg.dragNode.level === 1 && arg.pos === 0) {
      return of(true);
    } else {
      return of(false);
    }
  }

兩個函數代碼中的判斷看似一樣,但解釋已經放在代碼里了

3、對獲取的數據進行處理,方便傳給后端

數據處理結果:
[
{
父級id:,
子級id:,
排序:,
}
]

const afterArr: any = [];
    if (event.node.level === 0 && event.dragNode.level === 0) {
      // 父級移動
      console.log(event.dragNode.service.rootNodes);
      let arr: any = [];
      arr = event.dragNode.service.rootNodes;
      arr.forEach((element: any, i: number) => {
        const obj: any = {};
        obj.id = element.key;
        obj.parentId = 0;
        obj.sort = i + 2;
        afterArr.push(obj);
      });
      console.log(afterArr);
    } else if (event.node.level === 1 && event.dragNode.level === 1) {
      let parentIdAfter = event.node.origin.parentId;
      // 子級移動
      if (event.node.origin.parentId === event.dragNode.origin.parentId) {
        const arr: any = event.dragNode.parentNode.origin;
        arr.children.forEach((element: any, i: number) => {
          const obj: any = {};
          obj.id = element.key;
          obj.parentId = parentIdAfter;
          obj.sort = i;
          afterArr.push(obj);
        });
        this.cdr.markForCheck();
      } else {
        // 這里判斷跨域后的父級有沒有子級,parentNode為不為空
        let arr: any;
        if (event.node.parentNode === null) {
          arr = event.node.origin;
          parentIdAfter = event.node.key;
        } else {
          arr = event.node.parentNode.origin;
        }
        arr.children.forEach((element: any, i: number) => {
          const obj: any = {};
          obj.id = element.key;
          obj.parentId = parentIdAfter;
          obj.sort = i;
          afterArr.push(obj);
        });
        this.cdr.markForCheck();
      }
    } else if ( event.node.origin.children.length === 1 && event.dragNode.level === 1 && event.node.level === 0) {
      // 當拖拽的目標對象為空時走這個路
      let parentIdAfter = event.node.origin.parentId;
      // 子級移動
      if (event.node.origin.parentId === event.dragNode.origin.parentId) {
        const arr: any = event.dragNode.parentNode.origin;
        arr.children.forEach((element: any, i: number) => {
          const obj: any = {};
          obj.id = element.key;
          obj.parentId = parentIdAfter;
          obj.sort = i;
          afterArr.push(obj);
        });
        this.cdr.markForCheck();
      } else {
        // 這里判斷跨域后的父級有沒有子級,parentNode為不為空
        let arr: any;
        if (event.node.parentNode === null) {
          arr = event.node.origin;
          parentIdAfter = event.node.key;
        } else {
          arr = event.node.parentNode.origin;
        }
        arr.children.forEach((element: any, i: number) => {
          const obj: any = {};
          obj.id = element.key;
          obj.parentId = parentIdAfter;
          obj.sort = i;
          afterArr.push(obj);
        });
        this.cdr.markForCheck();
      }
    } else {
      return this.message.error('不可非法移動');
    }
    // 調用拖拽的接口
    let list: any = [];
    list = afterArr;
    this.organizationService.menutpProsystem({ list }).then((res: any) => {
      if (res.code === 200) {
        this.message.success('移動成功');
      } else {
        this.message.success('不可非法移動');
      }
    }).catch();

4、完整代碼

 <nz-alert nzType="info" nzMessage="特別提示:移動時,藍色線的長短代表級別"></nz-alert>
      <br />
      <nz-alert nzType="info" nzMessage="提示:子等級與父等級級別不可以改變。只可以改變菜單的排列順序與位置"></nz-alert>
        <nz-tree [nzData]="nodesTree" nzDraggable nzBlockNode (nzOnDrop)="nzEventTree($event)" [nzBeforeDrop]="beforeDrop"> </nz-tree>
      <br />
  nzEventTree(event: NzFormatEmitEvent | any): void | any {
    this.cdr.markForCheck();
    const afterArr: any = [];
    if (event.node.level === 0 && event.dragNode.level === 0) {
      // 父級移動
      console.log(event.dragNode.service.rootNodes);
      let arr: any = [];
      arr = event.dragNode.service.rootNodes;
      arr.forEach((element: any, i: number) => {
        const obj: any = {};
        obj.id = element.key;
        obj.parentId = 0;
        obj.sort = i + 2;
        afterArr.push(obj);
      });
      console.log(afterArr);
    } else if (event.node.level === 1 && event.dragNode.level === 1) {
      let parentIdAfter = event.node.origin.parentId;
      // 子級移動
      if (event.node.origin.parentId === event.dragNode.origin.parentId) {
        const arr: any = event.dragNode.parentNode.origin;
        arr.children.forEach((element: any, i: number) => {
          const obj: any = {};
          obj.id = element.key;
          obj.parentId = parentIdAfter;
          obj.sort = i;
          afterArr.push(obj);
        });
        this.cdr.markForCheck();
      } else {
        // 這里判斷跨域后的父級有沒有子級,parentNode為不為空
        let arr: any;
        if (event.node.parentNode === null) {
          arr = event.node.origin;
          parentIdAfter = event.node.key;
        } else {
          arr = event.node.parentNode.origin;
        }
        arr.children.forEach((element: any, i: number) => {
          const obj: any = {};
          obj.id = element.key;
          obj.parentId = parentIdAfter;
          obj.sort = i;
          afterArr.push(obj);
        });
        this.cdr.markForCheck();
      }
    } else if ( event.node.origin.children.length === 1 && event.dragNode.level === 1 && event.node.level === 0) {
      // 當拖拽的目標對象為空時走這個路
      let parentIdAfter = event.node.origin.parentId;
      // 子級移動
      if (event.node.origin.parentId === event.dragNode.origin.parentId) {
        const arr: any = event.dragNode.parentNode.origin;
        arr.children.forEach((element: any, i: number) => {
          const obj: any = {};
          obj.id = element.key;
          obj.parentId = parentIdAfter;
          obj.sort = i;
          afterArr.push(obj);
        });
        this.cdr.markForCheck();
      } else {
        // 這里判斷跨域后的父級有沒有子級,parentNode為不為空
        let arr: any;
        if (event.node.parentNode === null) {
          arr = event.node.origin;
          parentIdAfter = event.node.key;
        } else {
          arr = event.node.parentNode.origin;
        }
        arr.children.forEach((element: any, i: number) => {
          const obj: any = {};
          obj.id = element.key;
          obj.parentId = parentIdAfter;
          obj.sort = i;
          afterArr.push(obj);
        });
        this.cdr.markForCheck();
      }
    } else {
      return this.message.error('不可非法移動');
    }
    // 調用拖拽的接口
    let list: any = [];
    list = afterArr;
    this.organizationService.menutpProsystem({ list }).then((res: any) => {
      if (res.code === 200) {
        this.message.success('移動成功');
      } else {
        this.message.success('不可非法移動');
      }
    }).catch();
  }
  beforeDrop(arg: NzFormatBeforeDropEvent): any {
    // 要判斷是子級移動還是父級移動
    if (arg.node.level === 0 && arg.dragNode.level === 0 && arg.pos !== 0) {
      return of(true);
    } else if (arg.node.level === 1 && arg.dragNode.level === 1) {
      return of(true);
    } else if (arg.node.level === 0 && arg.dragNode.level === 1 && arg.pos === 0) {
      return of(true);
    } else {
      return of(false);
    }
  }

原文鏈接:https://blog.csdn.net/weixin_45158253/article/details/122094371

欄目分類
最近更新