From 3fbc7770eba3bed8a56e5e74aa87d0688bbae750 Mon Sep 17 00:00:00 2001 From: wangqing <250543222@qq.com> Date: Sun, 20 Jun 2021 15:34:54 +0800 Subject: [PATCH] fix bug --- src/components/parser/Parser.vue | 24 +++++++++++++++++++----- src/utils/expression.js | 24 +++++++++++++++--------- src/views/form/logic/index.vue | 6 +++--- src/views/form/preview/ProjectForm.vue | 16 +++++++++++++--- src/views/form/preview/index.vue | 2 +- src/views/form/statistics/chart.vue | 2 +- 6 files changed, 52 insertions(+), 22 deletions(-) diff --git a/src/components/parser/Parser.vue b/src/components/parser/Parser.vue index fd8af7c..5fe8817 100644 --- a/src/components/parser/Parser.vue +++ b/src/components/parser/Parser.vue @@ -39,8 +39,9 @@ const layouts = { if (value) { config.defaultValue = value } - // 控制逻辑显示隐藏 - let colStyle = scheme.logicShow ? '' : 'display:none' + // 表单被重新渲染 控制逻辑显示隐藏 + let triggerShow = _.indexOf(this.logicTriggerItemList, config.formId) > -1 + let colStyle = scheme.logicShow || triggerShow ? '' : 'display:none' let cidAttr = config.formId return ( @@ -143,8 +144,7 @@ function renderChildren(h, scheme) { return renderFormItem.call(this, h, config.children) } -function setUpload(config, scheme, response, file, fileList) { - console.log(fileList) +function setUpload(config, scheme, response, file) { let newValue = JSON.parse(this[this.formConf.formModel][scheme.__vModel__]) if (!newValue) { newValue = [] @@ -180,8 +180,14 @@ function setValue(event, config, scheme) { // 成立让该对应的问题显示出来 let flag = evalExpression(this[this.formConf.formModel], r.logicExpression) if (flag) { + // 防止表单重新渲染 display被刷新 + this.logicTriggerItemList.push(r.triggerFormItemId) + console.log(this.logicTriggerItemList) document.querySelector(`div[cid="${r.triggerFormItemId}"]`).style.display = '' } else { + _.remove(this.logicTriggerItemList, function(n) { + return n == r.triggerFormItemId + }) document.querySelector(`div[cid="${r.triggerFormItemId}"]`).style.display = 'none' } }) @@ -333,7 +339,9 @@ export default { formConfCopy: deepClone(this.formConf), [this.formConf.formModel]: deepClone(this.formModel), [this.formConf.labelFormModel]: deepClone(this.labelFormModel), - [this.formConf.formRules]: {} + [this.formConf.formRules]: {}, + // 已经被触发显示的问题 + logicTriggerItemList: [] } this.initFormData(data.formConfCopy.fields, data[this.formConf.formModel]) this.initLabelFormData(data.formConfCopy.fields, data[this.formConf.labelFormModel]) @@ -380,6 +388,12 @@ export default { }, buildRules(componentList, rules) { componentList.forEach(cur => { + // 逻辑不显示必填问题不校验 + let triggerShow = _.indexOf(this.logicTriggerItemList, cur.formItemId) > -1 + let flag = cur.logicShow || triggerShow ? '' : 'display:none' + if (flag) { + return + } const config = cur.__config__ if (cur.tag === 'el-upload') { config.regList.push({ diff --git a/src/utils/expression.js b/src/utils/expression.js index cbced89..5b37f88 100644 --- a/src/utils/expression.js +++ b/src/utils/expression.js @@ -5,11 +5,15 @@ import _ from 'lodash' */ const expressionOperator = { eq: function(v1, v2) { - console.log(v1) - console.log(v2) + if (!v1) { + return false + } return v1 == v2 }, ne: function(v1, v2) { + if (!v1) { + return false + } return v1 != v2 } } @@ -19,8 +23,8 @@ const expressionOperator = { * @type {{'1': string, '2': string}} */ const LogicConnector = { - 1: '||', - 2: '&&' + 1: 'and', + 2: 'or' } /** @@ -29,8 +33,10 @@ const LogicConnector = { * @connector 连接符 ||或者 && */ export function getExpression(conditionList, connector) { - let exList = conditionList.map(item => { - return `field${item.formItemId} ${item.expression} ${item.optionValue}` + let exList = conditionList.filter(item => { + return (Object.keys(item).length != 0) + }).map(item => { + return `field${item.formItemId} ${item.expression} ${item.optionValue} ` }) return _.join(exList, LogicConnector[connector]) } @@ -39,9 +45,9 @@ export function getExpression(conditionList, connector) { * 执行表达式是否成立 */ export function evalExpression(context, expression) { - let exArray = expression.split(/[|][&]/) + let exArray = expression.split(/and|or/) // 获取是& 还是| - let and = !exArray.indexOf('|') + let and = expression.indexOf('and') > -1 let flag = false console.log(exArray) for (let i = 0; i < exArray.length; i++) { @@ -59,7 +65,7 @@ export function evalExpression(context, expression) { console.log(fieldValue) flag = expressionOperator[sp](fieldValue, value) console.log(flag) - // & 一个不成立直接调出循环 返回成功 + // & 一个不成立直接调出循环 返回失败 if (and && !flag) { break // | 一个成立直接调出循环 返回成功 diff --git a/src/views/form/logic/index.vue b/src/views/form/logic/index.vue index 6fdbe55..bb1237e 100644 --- a/src/views/form/logic/index.vue +++ b/src/views/form/logic/index.vue @@ -40,7 +40,7 @@ :key="index" > - + {{ index + 1 }}. - + 条件时显示此问题: @@ -183,9 +183,9 @@ export default { } return false }) - console.log(updateVal) if (updateVal && updateVal[0] && updateVal[0].conditionList.length) { let updateData = updateVal[0] + updateData.projectKey = this.projectKey if (updateData.formItemId) { this.saveProjectLogic(updateData) diff --git a/src/views/form/preview/ProjectForm.vue b/src/views/form/preview/ProjectForm.vue index b2982dd..f8ea267 100644 --- a/src/views/form/preview/ProjectForm.vue +++ b/src/views/form/preview/ProjectForm.vue @@ -61,6 +61,14 @@ export default { projectKind: 1 } }, + metaInfo: { + meta: [ + { + name: 'viewport', + content: 'width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=no' + } + ] + }, data() { return { logicShowTriggerRule: {}, @@ -106,7 +114,6 @@ export default { beforeCreate() { document.querySelector('body').className = 'project-body' }, - created() { if (this.projectConfig && this.projectConfig.projectKey) { this.formConf.projectKey = this.projectConfig.projectKey @@ -217,14 +224,17 @@ export default { this.perPageFields = perPageFields }, /** - * 处理逻辑显示数据 - */ + * 处理逻辑显示数据 + */ logicShowTriggerHandle(logicItem) { if (!logicItem) { return } // 建立触发关系 该字段值发生变化时 哪些问题需要进行逻辑判断 确定是否显示 logicItem.conditionList.forEach(item => { + if (Object.keys(item).length === 0) { + return + } let rules = this.logicShowTriggerRule[item.formItemId] if (!rules) { rules = new Array() diff --git a/src/views/form/preview/index.vue b/src/views/form/preview/index.vue index 53ba94e..f7735b6 100644 --- a/src/views/form/preview/index.vue +++ b/src/views/form/preview/index.vue @@ -64,7 +64,7 @@ export default { mounted() { this.projectKey = this.$route.query.key let url = window.location.protocol + '//' + window.location.host - this.mobilePreviewUrl = `${url}/s/${this.projectKey}` + this.mobilePreviewUrl = `${url}/project/view?key=${this.projectKey}` this.$set(this.projectConfig, 'projectKey', this.projectKey) } } diff --git a/src/views/form/statistics/chart.vue b/src/views/form/statistics/chart.vue index 9aa3868..d2c23e7 100644 --- a/src/views/form/statistics/chart.vue +++ b/src/views/form/statistics/chart.vue @@ -28,7 +28,7 @@
- +

表单提交地域分布图