vue+element el-autocomplete el-select远程搜索

   el-autocomplete

ce5e5b39dc6e10ebba807302871cfb90204.jpg

<el-form-item label="所属机构" prop="organName" class="mar-b-25">
         <el-autocomplete 
                  v-model.trim="rolesForm.organName" 
                  :trigger-on-focus="false" 
                   :fetch-suggestions="querySearch" 
                   placeholder="请输入机构名称" 
                   @select="selectHandle" 
                   @blur="blurHandle"
                   style="width: 280px;">
        </el-autocomplete>
</el-form-item>

   data () {
        return {
            //角色信息表单
            rolesForm: {
                   roleName: '',
                aliveFlag: '',
                roleType: '',
                organName: '',
                organId: '',
            },
            originOrganName: '',//把一开始从列表进来后的机构名称保存起来,用于在修改所属机构不在系统列表时候,重新用这个赋值回所属机构
            timeout: '',//远程搜索机构的定时器
            organNameList: [],//远程搜索机构结果列表
        }





方法:

         //查询机构过滤
          createStateFilter(queryString) {
            return (list) => {
                return (list.name.indexOf(queryString) >= 0);
            }
          },
        //queryString 为在框中输入的值
        //callback 回调函数,将处理好的数据推回
        querySearch(queryString, callback) {
            let params = {
                ssxt: this.ssxt,
                pageSize: 50,
                name: this.rolesForm.organName,
                aliveFlag: 'Y'
              }
              //这里调用查询机构的接口
            if(this.rolesForm.organName){
                this.$api.organStructure.organ.getList(params)
                    .then( res => {
                        let data = res.data.data;
                        if(res.data.retcode === this.SUCCESS_CODE){
                            //在这里为这个数组中每一个对象加一个value字段, 因为autocomplete只识别value字段并在下拉列中显示
                            data.rows.forEach( (item , index) => {
                                item.value = item.name;//将想要展示的数据作为value
                            })
                              let restaurants = this.organNameList = data.rows;
                            let results = queryString ? restaurants.filter(this.createStateFilter(queryString)) : restaurants;
                            //先清理定时器
                            clearTimeout(this.timeout);
                            this.timeout = setTimeout(() => {
                                callback(results);
                            }, 100 * Math.random());
                        }else{
                            this.$message({
                                type: 'error',
                                message: res.data.retmsg
                            })
                        }
                    }).catch( err => {
                        callback([]);//如果搜索不到数据需要传空   才会隐藏下拉框
                          return;
                    })
            }
        },
        //选择机构和失去焦点的时候调用查询机构
        getOrganName(){
            let params = {
                ssxt: this.ssxt,
                pageSize: 50,
                aliveFlag: 'Y'
              }
            this.$api.organStructure.organ.getList(params)
                .then( res => {
                    let data = res.data.data;
                    if(res.data.retcode === this.SUCCESS_CODE){
                        let nameArrList = [];
                        data.rows.forEach( (item , index) => {
                            nameArrList.push(item.name);
                        })
                        if(nameArrList.indexOf(this.rolesForm.organName) < 0){
                            //如果输入的值不在机构列表中,那么会清空或者提示错误或者恢复原始值
                            this.$message({
                                type: 'error',
                                message: '输入的机构不在系统机构内,请重新输入或者保持不变!'
                            })
                            this.rolesForm.organName = this.originOrganName;
                            alert('false')
                            return false;
                        }else{
                            alert('true')
                            return true;
                        }
                    }else{
                        this.$message({
                            type: 'error',
                            message: res.data.retmsg
                        })
                    }
                }).catch( err => {
                    console.log(err)
                })
        },
        //选择机构
          selectHandle(item) {
            this.rolesForm.organId = item.id;
          },
          //所属机构失去焦点的时候也要判断是否包含,如并不包含,那么就恢复原来的机构或者清空
          blurHandle(item){
           this.getOrganName();
          },

 

以下是el-select

5978be50214838b6afb0c39a8355d5fc438.jpg


   <el-select v-model.trim="domain.roleName" value-key="id" :disabled="domain.disabled" 
		 @change="changeHandle" @focus="focusHandle(index)" 
		 filterable placeholder="请选择">
		     <el-option v-for="item in roleList" :key="item.id" :label="item.roleName" :value="item"></el-option>
   </el-select>

data(){return{
   options: [],//机构配置
}}

        //选中机构下拉获取id
		changeHandle(id){
			this.rolesForm.organId = id
		},
		//机构获取焦点时获取机构列表
		focusHandle(val){
			let params = {           
				ssxt: this.ssxt,
				pageSize: 50,
				aliveFlag: 'Y'
  			}                                      
        	this.$api.organStructure.organ.getList(params)
    			.then( res => {
    				let data = res.data.data;
    				if(res.data.retcode === this.SUCCESS_CODE){
    					let nameArrList = [];
    					data.rows.forEach( (item , index) => {
    						nameArrList.push(item.name);
    					})
    					this.organList = data.rows;
    				}else{
			    		this.$message({
			    			type: 'error',
			    			message: res.data.retmsg
			    		})
    				}
    			}).catch( err => {
		    		console.log(err)
    			})
		},

 

 

转载于:https://my.oschina.net/parchments/blog/3079439

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值