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

學(xué)無(wú)先后,達(dá)者為師

網(wǎng)站首頁(yè) 編程語(yǔ)言 正文

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

作者:蒲公英 更新時(shí)間: 2022-01-09 編程語(yǔ)言

zorro的11版本
angular11版本

使用場(chǎng)景:
把已經(jīng)組織好的菜單設(shè)置為可以拖拽排序。使用tree來(lái)完成這個(gè)功能

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

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

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

在這里插入圖片描述

提示:第一個(gè)示例,無(wú)論調(diào)不調(diào)接口,都能完成視覺(jué)上的拖拽,并獲得拖拽前后的數(shù)據(jù)。第二個(gè)示例,拖拽前校驗(yàn),不符合條件的,阻止拖拽。這里兩個(gè)合用是的效果就是:滿足條件就有拖拽效果,不滿足條件,無(wú)法拖拽(不調(diào)用接口排序時(shí))

怎么感覺(jué)不使用第二個(gè)也行呢,嗯!!!!!!!!

當(dāng)我不使用拖拽前校驗(yàn)(第二個(gè))時(shí),對(duì)拖拽前判斷時(shí),不好判斷,還是使用吧
代碼:

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

2、對(duì)拖拽前行為進(jìn)行判斷,不合法的拖拽進(jìn)行阻止

// 子等級(jí)與父等級(jí)級(jí)別不可以改變。只可以改變菜單的排列順序與位置
// 簡(jiǎn)單來(lái)說(shuō)就是,父級(jí)不能拖拽到其他父級(jí)的子級(jí)里。子級(jí)不能拖到外面成為父級(jí)。子級(jí)可以在不同的父級(jí)下拖拽排序。
// 這里有個(gè)特殊的就是:把子級(jí)拖拽到父級(jí)children=0下,這里不好判斷,我寫(xiě)在了第三個(gè)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('父級(jí)間移動(dòng)');
	} else if (event.node.level === 1 && event.dragNode.level === 1) {
	  return this.message.error('子級(jí)間移動(dòng)');
	} else if ( event.node.origin.children.length === 1 && event.dragNode.level === 1 && event.node.level === 0 ) {
	return this.message.error('將子級(jí)向空的目錄下移動(dòng)');
	} else {
	  return this.message.error('不可移動(dòng)');
	}
}-+



beforeDrop(arg: NzFormatBeforeDropEvent): any {
    // 要判斷是子級(jí)移動(dòng)還是父級(jí)移動(dòng)
    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);
    }
  }

兩個(gè)函數(shù)代碼中的判斷看似一樣,但解釋已經(jīng)放在代碼里了

3、對(duì)獲取的數(shù)據(jù)進(jìn)行處理,方便傳給后端

數(shù)據(jù)處理結(jié)果:
[
{
父級(jí)id:,
子級(jí)id:,
排序:,
}
]

const afterArr: any = [];
    if (event.node.level === 0 && event.dragNode.level === 0) {
      // 父級(jí)移動(dòng)
      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;
      // 子級(jí)移動(dòng)
      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 {
        // 這里判斷跨域后的父級(jí)有沒(méi)有子級(jí),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) {
      // 當(dāng)拖拽的目標(biāo)對(duì)象為空時(shí)走這個(gè)路
      let parentIdAfter = event.node.origin.parentId;
      // 子級(jí)移動(dòng)
      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 {
        // 這里判斷跨域后的父級(jí)有沒(méi)有子級(jí),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('不可非法移動(dòng)');
    }
    // 調(diào)用拖拽的接口
    let list: any = [];
    list = afterArr;
    this.organizationService.menutpProsystem({ list }).then((res: any) => {
      if (res.code === 200) {
        this.message.success('移動(dòng)成功');
      } else {
        this.message.success('不可非法移動(dòng)');
      }
    }).catch();

4、完整代碼

 <nz-alert nzType="info" nzMessage="特別提示:移動(dòng)時(shí),藍(lán)色線的長(zhǎng)短代表級(jí)別"></nz-alert>
      <br />
      <nz-alert nzType="info" nzMessage="提示:子等級(jí)與父等級(jí)級(jí)別不可以改變。只可以改變菜單的排列順序與位置"></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) {
      // 父級(jí)移動(dòng)
      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;
      // 子級(jí)移動(dòng)
      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 {
        // 這里判斷跨域后的父級(jí)有沒(méi)有子級(jí),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) {
      // 當(dāng)拖拽的目標(biāo)對(duì)象為空時(shí)走這個(gè)路
      let parentIdAfter = event.node.origin.parentId;
      // 子級(jí)移動(dòng)
      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 {
        // 這里判斷跨域后的父級(jí)有沒(méi)有子級(jí),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('不可非法移動(dòng)');
    }
    // 調(diào)用拖拽的接口
    let list: any = [];
    list = afterArr;
    this.organizationService.menutpProsystem({ list }).then((res: any) => {
      if (res.code === 200) {
        this.message.success('移動(dòng)成功');
      } else {
        this.message.success('不可非法移動(dòng)');
      }
    }).catch();
  }
  beforeDrop(arg: NzFormatBeforeDropEvent): any {
    // 要判斷是子級(jí)移動(dòng)還是父級(jí)移動(dòng)
    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

欄目分類(lèi)
最近更新