最近遇到一个需求,需要在fromgener中创建的表单中,根据某个表单项A,去修改其他表单项B,C,D的需求。由于表单是根据json渲染成的,开始使用this.$set(this.$refs.parse.formData,__vModel__+"_header",''),虽然能够讲数据赋值到this.$refs.parse.formData中,但是页面并未正确的显示出赋值的数据。
再经过多次的各种方法的尝试,最终选择了还是原始的数据回显的方式。
1.parser组件v-if来控制,主要是让数据重新回显,否则不起作用
<parser v-if="formConf && ok" :form-conf="formConf" ref="parse" />
2.表单项A是一个自定义组件,在change事件中触发bus事件,能够传递给使用该form的页面:
input_val(val) {
this.$emit('change', val) // 向父级组件返回输入的数据
...
this.$bus.$emit('changeInvoice',data) // bus事件,向使用表单的页面传递数据
},
3.在使用表单的页面接收事件
mounted(){
this.$bus.$on("changeInvoice", this.changeInvoice)
},
beforeDestroy () {
this.$bus.$off("changeInvoice")
},
4.changeInvoice事件,不仅要绑定B,C,D相关组件,同时还要将表单中的其他非相关数据绑定回去,否则其他非相关表单项会置空:
changeInvoice(val) {
let formData = this.$refs.parse.formData;
let __vModel__=val.__vModel__
this.ok=false
this.$nextTick(()=>{
this.formConf.fields.forEach(item => {
var __config__ = item.__config__
if(item.__vModel__== (__vModel__+'_header')){ // 赋值相关项
__config__.defaultValue = val.header
}else if(item.__vModel__== (__vModel__+'_type')){ // 赋值相关项
__config__.defaultValue = val.type
}else{
__config__.defaultValue=formData[item.__vModel__] // 回传非相关表单项
}
});
this.ok=true
})
},
暂时想到的解决办法,以后有了更好的方法再更新。