Просмотр исходного кода

[Mod 0000]修复AI弹框某些情况关闭后无法打开的问题

wangkeyi 6 дней назад
Родитель
Сommit
c3e9b6d9c5
1 измененных файлов с 27 добавлено и 25 удалено
  1. 27 25
      src/views/ventAI/manageAssistent/components/chatModal/ChatMessages.vue

+ 27 - 25
src/views/ventAI/manageAssistent/components/chatModal/ChatMessages.vue

@@ -175,8 +175,8 @@
               <span class="dot"></span>
             </div>
 
-            <!-- ask_user 交互提问 UI(分步向导) -->
-            <div v-if="message.isPendingApproval && message.pendingApprovalData?.ask_user" class="approval-card">
+            <!-- ask_user 交互提问 UI(分步向导):ask_user 存在但 questions 缺失时不渲染,避免模板访问异常 -->
+            <div v-if="message.isPendingApproval && message.pendingApprovalData?.ask_user?.questions?.length" class="approval-card">
               <div class="approval-icon"></div>
               <div class="approval-content">
                 <div class="approval-title">{{ message.pendingApprovalData?.message }}</div>
@@ -460,29 +460,6 @@
     messages: Message[];
   }>();
 
-  // Track the last pendingApprovalData reference to detect new interrupts
-  const lastApprovalDataRef = new Map<number, any>();
-
-  // 自动初始化 ask_user 答案状态
-  watch(
-    () => props.messages,
-    (msgs) => {
-      msgs.forEach((msg, idx) => {
-        if (msg.isPendingApproval && msg.pendingApprovalData?.ask_user?.questions) {
-          // Only reinitialize if pendingApprovalData object reference changed (new interrupt)
-          const lastRef = lastApprovalDataRef.get(idx);
-          if (lastRef !== msg.pendingApprovalData) {
-            lastApprovalDataRef.set(idx, msg.pendingApprovalData);
-            initAskUserAnswers(idx, msg.pendingApprovalData.ask_user.questions);
-          }
-        } else {
-          lastApprovalDataRef.delete(idx);
-        }
-      });
-    },
-    { immediate: true, deep: true }
-  );
-
   export interface AgentDetailData {
     messageIndex: number;
     agent: string;
@@ -775,6 +752,31 @@
     askUserCurrentStep[index] = 0;
   };
 
+  // Track the last pendingApprovalData reference to detect new interrupts
+  const lastApprovalDataRef = new Map<number, any>();
+
+  // 自动初始化 ask_user 答案状态。
+  // 必须注册在 initAskUserAnswers 等 const 声明之后:immediate watcher 在 setup 阶段同步执行,
+  // 若带审批消息重新挂载(关闭弹框后再打开),回调会访问尚未初始化的变量(TDZ 报错导致整个弹框挂载失败)
+  watch(
+    () => props.messages,
+    (msgs) => {
+      msgs.forEach((msg, idx) => {
+        if (msg.isPendingApproval && msg.pendingApprovalData?.ask_user?.questions) {
+          // Only reinitialize if pendingApprovalData object reference changed (new interrupt)
+          const lastRef = lastApprovalDataRef.get(idx);
+          if (lastRef !== msg.pendingApprovalData) {
+            lastApprovalDataRef.set(idx, msg.pendingApprovalData);
+            initAskUserAnswers(idx, msg.pendingApprovalData.ask_user.questions);
+          }
+        } else {
+          lastApprovalDataRef.delete(idx);
+        }
+      });
+    },
+    { immediate: true, deep: true }
+  );
+
   const isCurrentStepAnswered = (msgIndex: number, qIndex: number, question: { required?: boolean; type: string }) => {
     const answers = askUserAnswers[msgIndex];
     if (!answers) return false;