zoukankan      html  css  js  c++  java
  • Element中el-form嵌套el-table双击编辑提交检验

     <el-form ref="form" :rules="rules" :model="form">
          <el-table
            class="treat-table"
            :data="form.dataTable.slice((pageIndex-1)*pageSize,pageIndex*pageSize)"
            height="100%"
            @cell-dblclick="dbClickHandle"
            @selection-change="handleSelectionChange"
          >
            <el-table-column align="center" type="selection" width="50" />
    
            <el-table-column label="序号" width="60px" align="center">
              <template slot-scope="scope">
                {{ setIndex(scope.$index,pageIndex,pageSize) }}
              </template>
            </el-table-column>
    
            <el-table-column label="设备名称" width="100px" show-overflow-tooltip prop="AssetName" />
    
            <el-table-column label="策略名称" prop="RuleName">
              <template slot-scope="{row,$index}">
                <el-form-item v-if="showEdit[$index]['RuleName']" class="el-form-item-class" :prop=" 'dataTable.' + $index + '.RuleName' " :rules="rules.RuleName" :data="form.dataTable.RuleName">
                  <el-input
                    :ref="'RuleName'+$index"
                    v-model="row.RuleName"
                    @keyup.enter.native="$event.target.blur"
                    @change="handleEdit(row, $index)"
                    @blur="inputBlur(row,$index,'RuleName')"
                  />
                </el-form-item>
                <span v-if="!showEdit[$index]['RuleName']">{{ row.RuleName }}</span>
              </template>
            </el-table-column>
    
            <el-table-column label="协议" prop="Prot" width="100">
              <template slot-scope="{row,$index}">
                <el-form-item v-if="showEdit[$index]['Prot']" class="el-form-item-class" :prop=" 'dataTable.' + $index + '.Prot' " :data="form.dataTable.Prot">
                  <el-select
                    :ref="'Prot'+$index"
                    v-model="row.Prot"
                    filterable
                    @visible-change="visibleChange($event,row,$index,'Prot')"
                    @change="selectChange(row, $index)"
                  >
                    <el-option
                      v-for="item in protList"
                      :key="item.id"
                      :label="item.Prot"
                      :value="item.Prot"
                    />
                  </el-select>
                </el-form-item>
    
                <span v-if="!showEdit[$index]['Prot']">{{ row.Prot }}</span>
              </template>
            </el-table-column>
    
            <el-table-column label="业务规则" prop="BusinessIndex" width="150">
              <template slot-scope="{row,$index}">
                <el-form-item v-if="showEdit[$index]['BusinessIndex']" class="el-form-item-class" :prop=" 'dataTable.' + $index + '.BusinessIndex' " :data="form.dataTable.BusinessIndex">
                  <el-select
                    :ref="'BusinessIndex'+$index"
                    v-model="row.BusinessIndex"
                    filterable
                    @visible-change="visibleChange($event,row,$index,'BusinessIndex')"
                    @change="selectChange(row, $index)"
                  >
                    <el-option
                      v-for="item in businessList"
                      :key="item.BusinessIndex"
                      :label="item.BusinessName"
                      :value="item.BusinessIndex"
                    />
                  </el-select>
                </el-form-item>
    
                <span v-if="!showEdit[$index]['BusinessIndex']">{{ toBusiness(row.BusinessIndex) }}</span>
              </template>
            </el-table-column>
    
            <el-table-column label="源地址" prop="Srcip" width="220">
              <template slot-scope="{row,$index}">
                <el-form-item v-if="showEdit[$index]['Srcip']" :prop=" 'dataTable.' + $index + '.Srcip' " :rules="rules.Srcip">
                  <el-input
                    :ref="'Srcip'+$index"
                    v-model="row.Srcip"
                    oninput="value=value.replace(/[ a-zA-Z`~!@#$%^&()_+=<>?{}|,;'\[]·~!@#¥%……&()——+={}|《》?:“”【】、;‘’,。、u4e00-u9fa5]/g, '')"
                    @keyup.enter.native="$event.target.blur"
                    @change="handleEdit(row, $index)"
                    @blur="inputBlur(row,$index,'Srcip')"
                  />
                </el-form-item>
                <span v-if="!showEdit[$index]['Srcip']">{{ row.Srcip }}</span>
    
              </template>
            </el-table-column>
    
            <el-table-column label="源端口" prop="Srcport" width="120">
              <template slot-scope="{row,$index}">
                <el-form-item v-if="showEdit[$index]['Srcport']" :prop=" 'dataTable.' + $index + '.Srcport' " :rules="rules.Srcport">
                  <el-input
                    :ref="'Srcport'+$index"
                    v-model="row.Srcport"
                    oninput="value=value.replace(/[ a-zA-Z`~!@#$%^&()_+=<>?{}|,;'\[]·~!@#¥%……&()——+={}|《》?:“”【】、;‘’,。、u4e00-u9fa5]/g, '')"
                    @keyup.enter.native="$event.target.blur"
                    @change="handleEdit(row, $index)"
                    @blur="inputBlur(row,$index,'Srcport')"
                  />
                </el-form-item>
                <span v-if="!showEdit[$index]['Srcport']">{{ row.Srcport }}</span>
    
              </template>
            </el-table-column>
    
            <el-table-column label="目的地址" prop="Dstip" width="220">
              <template slot-scope="{row,$index}">
                <el-form-item v-if="showEdit[$index]['Dstip']" :prop=" 'dataTable.' + $index + '.Dstip' " :rules="rules.Dstip">
                  <el-input
                    :ref="'Dstip'+$index"
                    v-model="row.Dstip"
                    oninput="value=value.replace(/[ a-zA-Z`~!@#$%^&()_+=<>?{}|,;'\[]·~!@#¥%……&()——+={}|《》?:“”【】、;‘’,。、u4e00-u9fa5]/g, '')"
                    @keyup.enter.native="$event.target.blur"
                    @change="handleEdit(row, $index)"
                    @blur="inputBlur(row,$index,'Dstip')"
                  />
                </el-form-item>
                <span v-if="!showEdit[$index]['Dstip']">{{ row.Dstip }}</span>
    
              </template>
            </el-table-column>
    
            <el-table-column label="目的端口" prop="Dstport" width="120">
              <template slot-scope="{row,$index}">
                <el-form-item v-if="showEdit[$index]['Dstport']" :prop=" 'dataTable.' + $index + '.Dstport' " :rules="rules.Dstport">
                  <el-input
                    :ref="'Dstport'+$index"
                    v-model="row.Dstport"
                    oninput="value=value.replace(/[ a-zA-Z`~!@#$%^&()_+=<>?{}|,;'\[]·~!@#¥%……&()——+={}|《》?:“”【】、;‘’,。、u4e00-u9fa5]/g, '')"
                    @keyup.enter.native="$event.target.blur"
                    @change="handleEdit(row, $index)"
                    @blur="inputBlur(row,$index,'Dstport')"
                  />
                </el-form-item>
                <span v-if="!showEdit[$index]['Dstport']">{{ row.Dstport }}</span>
    
              </template>
            </el-table-column>
    
            <el-table-column label="启用" align="center" width="50">
              <template slot-scope="scope">
                <el-switch
                  :value="scope.row.using"
                  active-color="#227EE1"
                  inactive-color="#BCBCBC"
                  @change="changeC(scope.row)"
                />
              </template>
            </el-table-column>
    
            <el-table-column label="操作" align="center" width="250">
              <template slot-scope="scope">
                <el-tooltip content="下发" placement="top" effect="light">
                  <img
                    style="cursor: pointer;height:13px;13px"
                    :src="require('@/assets/button-Icon/down1.png')"
                    @click="IssueHandleCheck([scope.row])"
                  >
                </el-tooltip>
                <el-tooltip content="关联事件" placement="top" effect="light">
                  <img
                    style="margin-top:5px;cursor: pointer;margin-left:10px"
                    :src="require('@/assets/button-Icon/associate.png')"
                    @click="openEventDialog(scope.row)"
                  >
                </el-tooltip>
              </template>
            </el-table-column>
    
          </el-table>
        </el-form>
    

      js:

    export default {
      name: 'GatekeeperTreat',
      components: {
        ComponentEventsDialog,
        ComponentLoginValidate
      },
      directives: {
        focus: {
          // 指令的定义
          inserted: function(el) {
            el.focus()
          }
        }
      },
      data() {
        // 判断Ip
        var checkIp = (rule, value, callback) => {
          checkValidateIpAndPort(value, 'IP', callback)
          callback()
        }
        //  判断端口
        var checkPort = (rule, value, callback) => {
          checkValidateIpAndPort(value, 'PORT', callback)
          callback()
        }
        return {
          form: {
            dataTable: [
            ]
          },
          // dataTable: [],
          pageIndex: 1,
          pageSize: 15,
          totleCount: 0,
          multipleSelection: [],
          loading: false,
          businessList: [
            { BusinessIndex: 0,
              BusinessName: '无' }
          ],
    
          // 显示编辑框
          showEdit: [],
    
          // 协议数据
          protList: [
            {
              id: 0,
              Prot: 'TCP'
            },
            {
              id: 1,
              Prot: 'UDP'
            },
            {
              id: 2,
              Prot: 'ICMP'
            }
          ],
    
          loginIshow: false, // 是否显示二次验证弹框
    
          // 校验
          rules: {
            // 名称
            RuleName: [
              { required: true, message: '名称不能为空', trigger: 'blur' },
              { min: 1, max: 63, message: '长度在 1 到 63 个字符', trigger: 'blur' }
            ],
            // 源地址
            Srcip: [
              { required: true, message: '源地址不能为空', trigger: 'blur' },
              { validator: checkIp, trigger: 'blur' }
            ],
            // 源端口
            Srcport: [
              { required: true, message: '源端口不能为空', trigger: 'blur' },
              { validator: checkPort, trigger: 'blur' }
            ],
            // 目的地址
            Dstip: [
              { required: true, message: '目的地址不能为空', trigger: 'blur' },
              { validator: checkIp, trigger: 'blur' }
            ],
            // 目的端口
            Dstport: [
              { required: true, message: '目的端口不能为空', trigger: 'blur' },
              { validator: checkPort, trigger: 'blur' }
            ]
          }
        }
      },
      watch: {
        // 监控tableData数据,发生改变的时候跟新单元格显示状态
        'form.dataTable': function() {
          this.setShowEdit()
        }
      },
      methods: {
        showUs(datas) {
          this.analysis(datas)
        },
        setIndex(index, page, size) {
          return index + 1 + (page - 1) * size
        },
        visibleChange(flag, row, index, column) {
          if (!flag) {
            this.inputBlur(row, index, column)
          }
        },
        // 初始化单元格显示状态
        setShowEditInit() {
          for (const item of this.showEdit) {
            for (const innerItem in item) {
              item[innerItem] = false
            }
          }
        },
    
        // 设置单元显示转换数据
        setShowEdit() {
          const tempShowEdit = []
          for (const item of this.form.dataTable) {
            const tempShow = {}
            for (const innerItem in item) {
              tempShow[innerItem] = false
            }
            tempShowEdit.push(tempShow)
          }
          this.showEdit = tempShowEdit
        },
    
        // 切换单元格为编辑
        dbClickHandle(row, column, cell, event) {
          const nowObj = column.property
          const index = this.form.dataTable.indexOf(row)
          this.showEdit[index][nowObj] = true
    
          if (nowObj === 'BusinessIndex') {
            this.getBusinessHandle(row.Code)
          }
    
          this.$nextTick(() => {
            this.$refs[nowObj + index].focus()
          })
        },
    
        // 点击修改
        handleEdit(row, index) {
          this.form.dataTable[index] = row
        },
    
        // 失焦
        inputBlur(row, index, column) {
          const idx = this.form.dataTable.indexOf(row)
          if (idx === index) {
            var datas = this.showEdit[index]
            var prop = 'dataTable.' + index + '.' + column
    
            this.$refs['form'].validateField(prop, (error) => {
              if (!error) {
                if (datas) {
                  for (const innerItem in datas) {
                    if (innerItem === column && datas[innerItem]) {
                      datas[innerItem] = false
                    }
                  }
                }
              }
            })
          }
        },
    
        // 下拉框修改
        selectChange(row, index) {
          const tempTableData = this.form.dataTable
          tempTableData[index] = row
          this.form.dataTable = tempTableData
        },
    
    
        // 下发(校验有错误不让下发)
        IssueHandleCheck(datas) {
          this.$refs['form'].validate((valid) => {
            if (!valid) return
            if (datas && datas.length > 0) {
              this.$refs.LoginValidateRef.showUs()
    
              if (this.loginIshow) {
                this.$refs.LoginValidateRef.executePar(() => {
                  this.loading = true
                  this.bulkAddGatekeeper(datas)
                })
              } else {
                this.loading = true
                this.bulkAddGatekeeper(datas)
              }
            } else {
              this.$message.info('请选择下发策略')
              this.loading = false
            }
          })
        },
    
        bulkAddGatekeeper(datas) {
          bulkAddGatekeeper(datas, this.$store.state.user.accountName).then(res => {
            if (res) {
              if (res.code === 0) {
                this.$message.success('策略下发成功')
                this.$emit('initData', true)
              } else {
                this.$message.error(res.msg)
              }
            }
            this.loading = false
          }).catch(err => {
            this.loading = false
            console.error(err)
          })
        },
    
        toBusiness(str) {
          var result = '无'
          for (var business of this.businessList) {
            if (business.BusinessIndex === str) {
              result = business.BusinessName
              break
            }
          }
          return result
        },
    
        // 单选框选中获取数据
        handleSelectionChange(val) {
          this.multipleSelection = val
        },
    
        // 页面改变
        pageSizeChange(pageSize) {
          this.pageSize = pageSize
        },
    
        // 当前页
        pageCurrentChange(pageIndex) {
          this.pageIndex = pageIndex
        },
    
        // 获取业务规则
        async getBusinessHandle(id) {
          const data = {
            id: id
          }
          this.businessList = [
            { BusinessIndex: 0,
              BusinessName: '无' }
          ]
          await LoadBusiness(data).then(res => {
            if (res) {
              if (res.code === 0) {
                this.businessList = []
                this.businessList = res.data.data.Data
                this.businessList.unshift({
                  BusinessIndex: 0,
                  BusinessName: '无'
                })
              } else {
                this.$message.error(res.msg)
              }
            }
          })
        },
        openEventDialog(data) {
          this.$refs.eventsDialogRef.showUs(data)
        },
        // 是否启用
        changeC(data) {
          data.using = !data.using
        }
      }
    }
    

      

  • 相关阅读:
    Swift3 重写一个带占位符的textView
    Swift3 使用系统UIAlertView方法做吐司效果
    Swift3 页面顶部实现拉伸效果代码
    Swift3 倒计时按钮扩展
    iOS 获取当前对象所在的VC
    SpringBoot在IDEA下使用JPA
    hibernate 异常a different object with the same identifier value was already associated with the session
    SpringCloud IDEA 教学 番外篇 后台运行Eureka服务注册中心
    SpringCloud IDEA 教学 (五) 断路器控制台(HystrixDashboard)
    SpringCloud IDEA 教学 (四) 断路器(Hystrix)
  • 原文地址:https://www.cnblogs.com/sunliyuan/p/14794971.html
Copyright © 2011-2022 走看看