import { Component, OnInit } from '@angular/core'; import { products } from './products'; import { data as treeData } from '../treetable/treetable-demo.data'; @Component({ selector: 'multi-select-demo', templateUrl: './multi-select-demo.component.html' }) export class MultiSelectDemoComponent implements OnInit { leftDataSource = products; idField = 'ProductID'; textField = 'ProductName'; valueField = 'QuantityPerUnit'; sdata = []; getData($event) { this.sdata = $event; } leftTreeData = treeData.data; selectedId = [1, 2]; treeSelectedId = ['Home', 'prime.jpg2']; //be转换成树形结构的数据 formatedTreeData: any; //验证功能begin iField = 'id'; tField = 'name'; vField = 'code'; fField = 'fjms' list = [{ "id": "03c709c4-eda6-485a-8fc4-e788870de216", "name": "浪潮国际", "code": "lcgj", "notes": "浪潮国际", "fjms": { "path": "00010001", "layer": 2, "isDetail": false } }, { "id": "0a8adbde-a61f-4803-9299-defee82c1354", "name": "山东高速职能", "code": "sdgszn", "notes": "山东高速职能", "fjms": { "path": "00030001", "layer": 2, "isDetail": false } }, { "id": "1a94a764-e69e-4c88-bfe8-a6aaac3a675a", "name": "浪潮信息", "code": "lcxx", "notes": "浪潮信息", "fjms": { "path": "00010002", "layer": 2, "isDetail": true } }, { "id": "311c2561-521e-4da2-957d-b77893caf1bf", "name": "平台测试部", "code": "ptcsb", "notes": "平台测试部", "fjms": { "path": "0001000300010001", "layer": 4, "isDetail": false } }, { "id": "33d74afa-66ed-476d-abfc-9d711427dfdf", "name": "测试中心", "code": "cszx", "notes": "测试中心", "fjms": { "path": "000100030001", "layer": 3, "isDetail": false } }, { "id": "3a4271ff-950d-49f7-87aa-46925fcfb8fe", "name": "表单组", "code": "bdz", "notes": "表单组", "fjms": { "path": "00010003000100010001", "layer": 5, "isDetail": true } }, { "id": "40571209-2070-48e0-9225-3dcb3c998e0a", "name": "兖矿井下", "code": "ykjx", "notes": "兖矿井下", "fjms": { "path": "000200010001", "layer": 3, "isDetail": false } }, { "id": "47dec306-471f-4c4f-bcc9-b47197fd571c", "name": "山东高速集团", "code": "sdgsjt", "notes": "山东高速集团", "fjms": { "path": "0003", "layer": 1, "isDetail": false } }, { "id": "622b9a0a-4987-4e6c-88b7-e3381fa6f9be", "name": "框架组", "code": "kjz", "notes": "框架组", "fjms": { "path": "00010003000100010002", "layer": 5, "isDetail": true } }, { "id": "722257ed-3686-4a97-a5c4-6e2c707fc49c", "name": "软件集团", "code": "rjjt", "notes": "软件集团", "fjms": { "path": "00010003", "layer": 2, "isDetail": false } }, { "id": "7d37e8bf-e2aa-438d-bfd6-62d68af45e44", "name": "云服务", "code": "yfw", "notes": "云服务", "fjms": { "path": "00010004", "layer": 2, "isDetail": true } }, { "id": "9eb27c4c-5496-4949-a3e7-3e9b14bea9d4", "name": "web组", "code": "web", "notes": "web组", "fjms": { "path": "0001000100010001", "layer": 4, "isDetail": true } }, { "id": "a0f27d47-33e0-454b-8093-9dc4caa29636", "name": "临矿集团", "code": "lkjt", "notes": "临矿集团", "fjms": { "path": "00020002", "layer": 2, "isDetail": true } }, { "id": "a861e41b-4684-4475-8a8e-04a2f1eafd59", "name": "行政部门", "code": "xzbm", "notes": "行政部门", "fjms": { "path": "000300010001", "layer": 3, "isDetail": true } }, { "id": "cfea2e98-eb8d-4bb7-9040-7d004e638a85", "name": "山东能源集团", "code": "sdnyjt", "notes": "山东能源集团", "fjms": { "path": "0002", "layer": 1, "isDetail": false } }, { "id": "d29d75fa-5ab4-4efa-afa7-fa9b870d44b7", "name": "浪潮集团", "code": "lcjt", "notes": "浪潮集团", "fjms": { "path": "0001", "layer": 1, "isDetail": false } }, { "id": "d49ac069-43ad-4931-a5a5-464256cb6d00", "name": "兖矿集团", "code": "ykjt", "notes": "兖矿集团", "fjms": { "path": "00020001", "layer": 2, "isDetail": false } }, { "id": "d9cf72ce-5b29-4153-8a43-24400639ff32", "name": "平台技术部", "code": "ptjsb", "notes": "平台技术部", "fjms": { "path": "000100010001", "layer": 3, "isDetail": false } }, { "id": "e58382d7-364d-4c98-a5ef-1554d1ecc12a", "name": "第一下分队", "code": "dyxfd", "notes": "第一下分队", "fjms": { "path": "0002000100010001", "layer": 4, "isDetail": true } }, { "id": "f1d73397-d1e5-4b17-a190-6091f03568d3", "name": "lcm", "code": "lcm", "notes": "lcm", "fjms": { "path": "0001000100010002", "layer": 4, "isDetail": true } }]; //验证功能end constructor() { } ngOnInit() { this.formatedTreeData = this.plainToTree(this.list, 'fjms', 1); } saveList() { alert(this.selectedId.join(',')) } saveTree() { alert(this.treeSelectedId.join(',')) } /** * * @param data 需要格式化的数据 */ private formatDataSource(data: any[]) { let newData = []; if (data.length) { data.forEach(item => { newData.push({ data: { [`${this.iField}`]: item[this.iField], [`${this.tField}`]: item[this.tField], [`${this.vField}`]: item[this.vField], [`${this.fField}`]: item[this.fField] }, children: [] }) }) } return newData; } /** * 把平行结构的数据转换成树形结构 * @param plainSource * @param field * @param layer */ private plainToTree(plainSource: any, field: string, layer: number) { const treeSource = this.formatDataSource(plainSource); if (!treeSource.length) { console.log('数据为空,不能转换成树形结构'); return []; } if (!treeSource[0]['data'][field]) { console.log('需要转换成树形结构的关键字段不存在'); return []; } const parents = treeSource.filter(item => { return item['data'][field]['layer'] === layer; }) this.recursive(parents, treeSource, field, 1); return parents; } /** * 递归遍历树形结构 * @param parents * @param treeSource * @param field * @param layer */ private recursive(parents: any, treeSource: any, field: string, layer: number) { parents.forEach(parent => { const parentPath = parent['data'][field]['path']; const parentLayer = parent['data'][field]['layer']; if (parent['data'][field]['isDetail'] === false) { treeSource.forEach(item => { if (item && item['data'] && item['data'][field] && item['data'][field]['path']) { const itemPath = item['data'][field]['path']; const itemLayer = item['data'][field]['layer']; let targetPath: string; if(itemPath && itemPath.length > parentPath.length){ targetPath = itemPath.substr(0, Number(layer) * 4); } if (parentPath === targetPath && parentLayer === itemLayer - 1) { parent['children'].push(item); } if (item['data'][field]['isDetail'] === false && parentPath === targetPath) { this.recursive([item], treeSource, field, Number(layer) + 1); } } }); } }) } }