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
        }
      }
    }
    

      

  • 相关阅读:
    php程序员面试经验
    模板引擎(smarty)知识点总结五
    模板引擎(smarty)知识点总结三
    js计算字数
    phpexcel导出成绩表
    phpexcel用法(转)
    模板引擎(smarty)知识点总结
    apache泛域名解析
    对象的解构赋值
    解构赋值
  • 原文地址:https://www.cnblogs.com/sunliyuan/p/14794971.html
Copyright © 2011-2022 走看看