<template> <div> <Form ref="formInline"> <FormItem prop="user" label="选择角色:" :label-width="100"> <Input v-model="roleNames" @on-focus="openRoleSelect" placeholder="" /> </FormItem> </Form> <Modal v-model="value" title="选择角色" @on-ok="ok" @on-cancel="closeModal"> <div> <Tree ref="tree" :data="roleTree" :load-data="loadRoleData" show-checkbox ></Tree> </div> </Modal> </div> </template> <script> export default { components: {}, props: { checkedList: { type: Object, default: () => ({title: [], value: []}) }, bizAttr: { type: Object }, }, data() { return { value: false, roleNames: this.checkedList.title, roleTree: [], formData: this.checkedList, }; }, mounted() { }, methods: { queryRoleGroup() { GMS.$http.get(`/nvwa-authority-role/v1/query-group`).then((res) => { if (res.status == 200) { this.roleTree = this.formatTree(res.data); } }); }, loadRoleData(item, callback) { GMS.$http .get(`/nvwa-authority-role/v1/query-child`, { params: { groupId: item.id }, }) .then((res) => { if (res.status == 200) { callback(this.formatTree(res.data, true)); } }); }, formatTree(data, withTag) { return data.map((element) => { var checked = this.formData.value && this.formData.value.includes(element.id); if (element.hasOwnProperty("leaf")) return { title: withTag ? element.name ? `${element.title}(${element.name})` : element.title : element.title, loading: false, id: element.id, leaf: false, children: [], }; else return { title: withTag ? element.name ? `${element.title}(${element.name})` : element.title : element.title, id: element.id, checked: checked, leaf: true, }; }); }, openRoleSelect() { this.queryRoleGroup(); this.value = true; }, ok() { var checkedNodes = this.$refs.tree .getCheckedNodes() .filter((node) => node.leaf) .map((node) => { return { id: node.id, name: node.title }; }); this.formData = { name: 'roles', title: checkedNodes.map((e) => e.name), value: checkedNodes.map((e) => e.id) } this.roleNames = checkedNodes.map((e) => e.name); this.$emit("on-ok", checkedNodes); this.closeModal(); }, closeModal() { this.value = false; }, }, }; </script>