vue element -级联选择器,复杂操作,异步加载所有级联选项,并回显 解决因id 有部分重复后导致的bug问题 无法回显的问题


 
<!-- @format -->

<!-- 模块 校管-课程管理-课表管理 -修改课表信息弹框 -->
< template >
   < div >
     < el-dialog
       width= "600px"
      : title=" dialogInfo. title"
      : close-on-click-modal=" false"
      : visible=" true"
      : before-close=" closeSelf"
     >
       < div  class= "dialog-cont" >
         < el-form
           class= "create-form"
          : model=" dataForm"
          : rules=" dataRule"
           ref= "ruleForm"
           label-width= "110px"
         >
           < el-form-item  label= "课程名称:"  prop= "courseName" >
             <!--<span class="course-name-box nowrap" :title="dataForm.courseName">{{
              dataForm.courseName
            }}</span>-->
             < el-input
               v-model=" dataForm. courseName"
               maxlength= "100"
               show-word-limit
               placeholder= "请输入课程名称"
             ></ el-input >
           </ el-form-item >
           < el-form-item
             v-if=" dialogInfo. pageState ===  'edit'"
             label= "讲师:"
             prop= "teacherName"
           >
             < span  class= "teacher-holder"  v-show=" dataForm. teacherName" >{{
               dataForm. teacherName
            }} </ span >
             < span @ click=" showChildDialog" >
               < i  class= "icon-edit" ></ i >
               < span  class= "edit" >修改 </ span >
             </ span >
           </ el-form-item >
           < el-form-item  label= "学段:"  prop= "phase" >
             < el-radio-group  v-model=" dataForm. phase" @ change=" getGrade" >
               < el-radio : label=" '03'" >小学 </ el-radio >
               < el-radio : label=" '04'" >初中 </ el-radio >
               < el-radio : label=" '05'" >高中 </ el-radio >
             </ el-radio-group >
           </ el-form-item >
           < el-form-item  label= "年级:"  prop= "grade" >
             < el-select
               v-model=" dataForm. grade"
              @ change=" handleGrade"
               placeholder= "请选择年级"
             >
               < el-option
                 v-for="( itemindexin  gradeArr"
                : key=" index"
                : label=" item. name"
                : value=" item. code"
               >
               </ el-option >
             </ el-select >
           </ el-form-item >
           < el-form-item  label= "学科:"  prop= "courseNameArr" >
             < el-cascader
               v-if=" showCascader"
              : disabled="! editFlag"
               ref= "cascader"
               class= "cascader"
               v-model=" dataForm. courseNameArr"
              : props=" props"
              @ change=" chooseCourse"
             ></ el-cascader >
             < span  class= "tip-message" >请先选择学段和年级,再选择学科! </ span >
             <!-- <el-input v-model="dataForm.courseName" placeholder="\请输入课程名称"></el-input> -->
           </ el-form-item >
           < el-form-item
             v-if=" dialogInfo. pageState !==  'edit'"
             label= "课程简介:"
           >
             < el-input
               type= "textarea"
               placeholder= "请输入课程简介"
               v-model=" dataForm. courseIntroduce"
               maxlength= "50"
              : rows=" 2"
               show-word-limit
             >
             </ el-input >
           </ el-form-item >
         </ el-form >
       </ div >
       < div  slot= "footer"  class= "dialog-footer" >
         < el-button @ click=" closeSelf()" >取消 </ el-button >
         < el-button  type= "primary" @ click=" dataFormSubmit()" >确定 </ el-button >
       </ div >
       < el-dialog
         width= "800px"
         title= "选择讲师"
        : visible. sync=" innerVisible"
         append-to-body
       >
         < div  class= "dialog-cont" >
           < div >
             < el-form : inline=" trueclass= "create-form"  label-width= "50px" >
               < el-form-item  label= "姓名:" >
                 < el-input
                   v-model=" realName"
                   placeholder= "请输入姓名"
                 ></ el-input >
               </ el-form-item >
               < el-form-item >
                 < el-button  type= "warning" @ click=" searchList" >查询 </ el-button >
               </ el-form-item >
             </ el-form >
           </ div >
           < div  class= "table-view" >
             < CommonTable
              : columnsData=" columnsData"
              : tableData=" tableData"
             ></ CommonTable >
             < pagenation
              : pageInfo=" pageInfo"
               v-if=" tableData. length >  0"
              @ getNewPage=" getNewData"
             >
             </ pagenation >
           </ div >
         </ div >
       </ el-dialog >
     </ el-dialog >
   </ div >
</ template >

< script >
import  CommonTable  from  '@/components/common/common-table';
import  pagenation  from  '@/components/common/pagenation';
import {  timeFormatgetDateTime }  from  '@/utils';
import {  dateUtils }  from  '@/utils/dateUtils';

export  default {
   name:  'dialog-editCourseTable',
   components: {  CommonTablepagenation },
   data() {
     let  self =  this;
     return {
       pageInfo: {
         total:  0,
         pageSize:  10,
         pageNum:  1
      },
       innerVisible:  false,
       showCascader:  true,
       dataForm: {
         courseNameArr: [],
         sn:  null//为空时为新增,否则为修改
         courseName:  '',
         teacherName:  '',
         teacherId:  '',
         subject:  ''//科目
         grade:  ''//年级
         phase:  '03'//学段
         volume:  ''//册别
         edition:  ''//版本
         book:  ''//教材
         bookUnit:  ''//教材目录
         courseIntroduce:  ''  //课程简介
      },
       dataRule: {
         courseName: [
          {  required:  truemessage:  '课程名称不能为空'trigger:  'change' }
        ],
         courseNameArr: [
          {  required:  truemessage:  '学科不能为空'trigger:  'change' }
        ],
         teacherName: [
          {  required:  truemessage:  '请选择讲师'trigger:  'change' }
        ],
         grade: [{  required:  truemessage:  '请选择年级'trigger:  'change' }],
         phase: [{  required:  truemessage:  '请选择学段'trigger:  'change' }]
      },
       gradeArr: [],
       realName:  '',
       tableData: [],
       columnsData: [
        {
           label:  '姓名',
           prop:  'userName',
           width:  130
        },
        {
           label:  '性别',
           width:  130,
           formatter :  row  => {
             let  sex =  '男';
             if ( row. genderCode ===  '0') {
               sex =  '男';
            }  else  if ( row. genderCode ===  '1') {
               sex =  '女';
            }  else {
               sex =  '未知';
            }
             return  sex;
          }
        },
        {
           label:  '账号',
           prop:  'loginName',
           width:  146,
           showOverflowTooltip:  true
        },
        {
           label:  '授课关系',
           width:  170,
           prop:  'relative'
        },
        {
           type:  'options',
           label:  '操作',
           align:  'center',
           render : ( h, {  row })  => {
             const  checkBtn =  h(
               'a',
              {
                 class:  'btn-option',
                 on: {
                   click : ()  => {
                     this. chooseTeacher( row);  //选择
                  }
                }
              },
               '选择'
            );
             const  disabledText =  h(
               'a',
              {
                 class:  'btn-option disabled',
                 on: {}
              },
               '该老师已有课程,不可选择'
            );
             let  operationViews = [];
             if ( row. status ===  1) {
               operationViews. push( disabledText);
            }  else {
               operationViews. push( checkBtn);
            }
             return  h(
               'div',
              {
                 class:  'table-opt-btns'
              },
               operationViews
            );
          }
        }
      ],
       props: {
         value:  'code',
         label:  'name',
         lazy:  true,
         lazyLoad( noderesolve) {
           self. chooseCourseHandle( noderesolve);
        }
      }
    };
  },
   props: {
     checkedArr: {
       type:  Array,
       default : ()  => {
         return [];
      }
    },
     dialogInfo: {
       type:  Object,
       default : ()  => {
         return {
           title:  '信息设置',
           pageState:  'edit'
        };
      }
    },
     weekInfo: {
       type:  Object,
       default : ()  => {
         return {};
      }
    },
     tdItem: {
       type:  Object,
       default : ()  => {
         return {};
      }
    },
     timeItem: {
       type:  Object,
       default : ()  => {
         return {};
      }
    },
     selfTeacher: {
       type:  Boolean,
       default:  false
    }
  },
   watch: {},
   computed: {
     editFlag() {
       return !!( this. dataForm. grade &&  this. dataForm. phase);
    }
  },
   created() {
     if (! this. selfTeacher) {
       this. getTeachersPage();
    }

     /* 编辑该课程时 设置form 信息*/
     if ( this. tdItem. teacherId) {
       this. resetting();
    }
     this. getGrade();
  },
   methods: {
     resetting() {
       this. dataForm =  Object. assign( this. dataFormthis. tdItem);
       this. dataForm. courseIntroduce ==  '0'
        ? ( this. dataForm. courseIntroduce =  '')
        :  null;
       this. dataForm. courseNameArr = [
         this. tdItem. subject +  'subjects',
         this. tdItem. edition +  'editions',
         this. tdItem. volume +  'volums',
         this. tdItem. book +  'books',
         this. tdItem. bookUnit +  'units'
      ];
    },
     //分页
     getNewData( num) {
       this. pageInfo. pageNum =  num;
       this. getTeachersPage();
    },
     /* 点击查询 获取老师列表 */
     searchList() {
       this. pageInfo. pageNum =  1;
       this. getTeachersPage();
    },
     /* 获取老师列表 */
     getTeachersPage() {
       let  nowTime =  dateUtils. getDayByWeekDay(
         this. weekInfo. weekCount,
         this. tdItem. dayNum
      );
       this. $api[ 'course/getTeachersPage']({
         realName:  this. realName,
         pageNum:  this. pageInfo. pageNum,
         pageSize:  this. pageInfo. pageSize,
         startTime:  getDateTime( nowTime +  ' ' +  this. timeItem. startTime),
         endTime:  getDateTime( nowTime +  ' ' +  this. timeItem. endTime),
         dayNum:  this. tdItem. dayNum
      })
        . then( res  => {
           this. pageInfo. total =  res. total;
           this. tableData =  res. list;
        })
        . catch( err  => {
           // this.$message.error(err);
        });
    },
     /* 提交表单 */
     dataFormSubmit() {
       this. $refs[ 'ruleForm']. validate( valid  => {
         if ( valid) {
           this. $emit( 'setCourseInfo'this. dataForm);
           this. $parent. showDialog =  false;
        }  else {
           console. log( 'error submit!!');
           return  false;
        }
      });
    },
     /* 关闭弹框 */
     closeSelf() {
       this. $parent. showDialog =  false;
    },
     /* 打开老师列表弹框 */
     showChildDialog() {
       this. innerVisible =  true;
    },
     /* 选择老师方法 */
     chooseTeacher( row) {
       this. dataForm. teacherId =  row. id;
       this. dataForm. teacherName =  row. userName;
       this. innerVisible =  false;
       this. $refs. ruleForm. validateField( 'teacherName');
    },
     /*级联选择器 选择课程的学科等  */
     chooseCourse( data) {
       let  nodeArr =  this. $refs. cascader. getCheckedNodes();
       let  courseName =  '';
       let  nameArr =  nodeArr[ 0]. pathLabels;
       let  idArr =  nodeArr[ 0]. path;
       // let bookInfo = nodeArr[0].parent;
       courseName =  nameArr[ 4] +  '-' +  nameArr[ 3];
       this. dataForm. courseName =  courseName;
       this. dataForm. subject =  idArr[ 0]. replace( 'subjects''');
       this. dataForm. edition =  idArr[ 1]. replace( 'editions''');
       this. dataForm. volume =  idArr[ 2]. replace( 'volums''');
       this. dataForm. book =  idArr[ 3]. replace( 'books''');
       this. dataForm. bookUnit =  idArr[ 4]. replace( 'units''');
       this. $refs. ruleForm. validateField( 'courseName');
    },
     /* 获取年级 */
     getGrade( val) {
       if ( val) {
         this. $nextTick(()  => {
           this. dataForm. grade =  '';
           this. dataForm. courseNameArr = [];
           this. $refs. cascader. $children[ 1]. loadCount =  0;
           this. $refs. cascader. $children[ 1]. menus = [];
           this. $refs. cascader. $children[ 1]. lazyLoad();
        });
      }
       // this.showCascader = false;
       // this.showCascader = true;
       this. $api[ 'common/getGrades']({
         phase:  this. dataForm. phase
      })
        . then( res  => {
           this. gradeArr =  res;
        })
        . catch( err  => {
           // this.$message.error(err);
        });
    },
     /* 下拉值改变 将下方学科级联给清空 */
     handleGrade( val) {
       this. dataForm. courseNameArr = [];
       this. $nextTick(()  => {
         this. $refs. cascader. $children[ 1]. loadCount =  0;
         this. $refs. cascader. $children[ 1]. menus = [];
         this. $refs. cascader. $children[ 1]. lazyLoad();
      });
    },
     /* 级联选择器的 回调 根据返回的node对象中的level的值进行判断 */
     chooseCourseHandle( noderesolve) {
       if ( node. level ==  0) {
         this. getSubjects( noderesolve);
      }  else  if ( node. level ==  1) {
         this. getEditions( noderesolve);
      }  else  if ( node. level ==  2) {
         this. getVolums( noderesolve);
      }  else  if ( node. level ==  3) {
         this. getBooks( noderesolve);
      }  else  if ( node. level ==  4) {
         this. getBookUnits( noderesolve);
      }
    },
     /* 获取学科 */
     getSubjects( noderesolve) {
       this. $api[ 'common/getSubjects']({})
        . then( res  => {
           res. forEach( item  => {
             item. leaf =  false;
             item. code =  item. code +  'subjects';
          });
           resolve( res);
        })
        . catch( err  => {
           // this.$message.error(err);
        });
    },
     /*获取教材版本数据 */
     getEditions( noderesolve) {
       this. dataForm. subject =  node. value. replace( 'subjects''');
       this. $api[ 'common/getEditions']({
         phase:  this. dataForm. phase,
         subject:  this. dataForm. subject
      })
        . then( res  => {
           res. forEach( item  => {
             item. leaf =  false;
             item. code =  item. code +  'editions';
          });
           resolve( res);
        })
        . catch( err  => {
           // this.$message.error(err);
        });
    },
     /*获取册别数据 */
     getVolums( noderesolve) {
       this. dataForm. subject =  node. path[ 0]. replace( /subjects/ g'');
       this. dataForm. edition =  node. value. replace( 'editions''');
       this. $api[ 'common/getVolums']({
         phase:  this. dataForm. phase,
         subject:  this. dataForm. subject,
         edition:  this. dataForm. edition
      })
        . then( res  => {
           res. forEach( item  => {
             item. leaf =  false;
             item. code =  item. code +  'volums';
          });
           resolve( res);
        })
        . catch( err  => {
           // this.$message.error(err);
        });
    },
     /*获取课本数据 */
     getBooks( noderesolve) {
       this. dataForm. subject =  node. path[ 0]. replace( /subjects/ g'');
       this. dataForm. volume =  node. value. replace( 'volums''');
       this. $api[ 'common/getBooks']({
         phase:  this. dataForm. phase,
         subject:  this. dataForm. subject,
         edition:  this. dataForm. edition,
         volume:  this. dataForm. volume
         // grade: this.dataForm.grade
      })
        . then( res  => {
           res. forEach( item  => {
             item. leaf =  false;
             item. code =  item. bookCode +  'books';
             item. name =  item. bookName;
          });
           resolve( res);
        })
        . catch( err  => {
           // this.$message.error(err);
        });
    },
     /*获取课本目录数据 */
     getBookUnits( noderesolve) {
       this. dataForm. bookCode =  node. value. replace( 'books''');
       this. $api[ 'common/getBookUnits']({
         bookCode:  this. dataForm. bookCode
      })
        . then( res  => {
           res. forEach( item  => {
             item. leaf =  true;
             item. code =  item. code +  'units';
          });
           resolve( res);
        })
        . catch( err  => {
           // this.$message.error(err);
        });
    }
  }
};
</ script >

< style  scoped  lang= "less" >
.dialog-cont {
  /deep/ .el-cascader {
     line-height30px;
  }
}
/deep/ .el-table__row {
   .cell {
     text-overflowellipsis;
     overflowhidden;
     white-spacenowrap;
  }
}
.cascader {
   width400px;
   positionrelative;
}
.teacher-holder {
   margin-right10px;
}
.icon-edit {
   backgroundurl( '../../assets/images/icon/edit.png' );
   width15px;
   height16px;
   displayinline-block;
   margin-right5px;
   margin-bottom-2px;
}
.edit {
   line-height24px;
   color#228cf9;
   cursorpointer;
}
.course-name-box {
   displayinline-block;
   background-color#fff;
   border-radius4px;
   border1px  solid  #dcdfe6;
   color#606266;
   font-sizeinherit;
   height30px;
   line-height30px;
   padding0  15px;
   -webkit-transitionborder-color  0.2s  cubic-bezier( 0.6450.0450.3551);
   transitionborder-color  0.2s  cubic-bezier( 0.6450.0450.3551);
   width400px;
}
.tip-message {
   font-size12px;
   displayinline-block;
   padding-left18px;
   backgroundurl( '../../assets/images/icon/icon-tip.png' )  no-repeat  left  2px;
   height16px;
   line-height16px;
   margin-left4px;
   color#999999;
   positionrelative;
   bottom2px;
}
</ style >


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM