Procházet zdrojové kódy

修复社保方案编辑弹窗「基数全都填了仍提示必填未补全」:async-validator@1.8.5 以普通函数调用自定义校验器(this = undefined),baseRangeRule 里读 this.form 必抛 TypeError 被 handleSave 的 try/catch 兜成 valid=false;改为闭包传入组件实例 vm 再取 form,校验恢复正常

lihaiting před 1 dnem
rodič
revize
a700f02b86
1 změnil soubory, kde provedl 12 přidání a 6 odebrání
  1. 12 6
      src/views/salary/socialScheme/SchemeEditDialog.vue

+ 12 - 6
src/views/salary/socialScheme/SchemeEditDialog.vue

@@ -379,11 +379,17 @@ const RATE_HINTS = {
  * 由两个输入框的 change 事件主动触发校验)。
  * 复测 P1-13:socialBaseMin/Max 与 fundBaseMin/Max 都是后端 required,
  * 原实现要么没有规则、要么规则挂在没有 prop 的表单项上 → 永不触发。
+ *
+ * ★ 2026-10-20 修复「全都填了仍提示必填未补全」:
+ *   async-validator@1.8.5 以普通函数调用执行自定义校验器(lib/index.js L234)且全程 'use strict',
+ *   validator 里的 this = undefined —— 这里绝不能写 this.form,必须经闭包把组件实例(vm)传进来。
+ *   原来的 this.form 每次校验必抛 TypeError,被 handleSave 的 try/catch 兜成 valid=false,
+ *   表现为不管填没填全、点保存必弹「请先补全表单中的必填项」。
  */
-const baseRangeRule = (label, minKey, maxKey) => ({
+const baseRangeRule = (label, minKey, maxKey, vm) => ({
   validator(rule, value, callback) {
-    const min = this.form[minKey];
-    const max = this.form[maxKey];
+    const min = vm.form[minKey];
+    const max = vm.form[maxKey];
     if (min == null || min === '' || isNaN(Number(min)) || Number(min) < 0) {
       callback(new Error(`请输入${label}下限`));
       return;
@@ -453,9 +459,9 @@ export default {
         effectiveDate: [{ required: true, message: '请选择生效日期', trigger: 'change' }],
         /* 后端保存参数 required 含 location(参保地)—— 选到省/市即可,很多城市按市统筹 */
         location: [locationRequired],
-        /* 基数上下限:挂在虚拟 prop 上,由两个输入框的 change 主动触发 */
-        socialBaseRange: [baseRangeRule('社保基数', 'socialBaseMin', 'socialBaseMax')],
-        fundBaseRange: [baseRangeRule('公积金基数', 'fundBaseMin', 'fundBaseMax')]
+        /* 基数上下限:挂在虚拟 prop 上,由两个输入框的 change 主动触发(vm 见 baseRangeRule 注释) */
+        socialBaseRange: [baseRangeRule('社保基数', 'socialBaseMin', 'socialBaseMax', this)],
+        fundBaseRange: [baseRangeRule('公积金基数', 'fundBaseMin', 'fundBaseMax', this)]
       }
     };
   },