lsc před 2 týdny
rodič
revize
f0d7a3dcca
1 změnil soubory, kde provedl 9 přidání a 7 odebrání
  1. 9 7
      src/views/Student/index.vue

+ 9 - 7
src/views/Student/index.vue

@@ -1495,8 +1495,8 @@ const clearAllSyncStates = () => {
     if (props.type == '1' && isCreator.value && docSocket.value) {
       console.log('🧹 创建老师退出,清空所有同步状态')
       docSocket.value.transact(() => {
-        // 清空普通消息(Map 结构)
-        const messageMap = docSocket.value?.getMap?.('message')
+        // 清空普通消息(Map 结构,messageV2 避免与旧 Array('message') 根类型冲突)
+        const messageMap = docSocket.value?.getMap?.('messageV2')
         if (messageMap) {
           messageMap.delete('latest')
         }
@@ -3216,7 +3216,9 @@ const messageInit = () => {
   // 初始化普通消息数组(只保留最后一条)
   if (!yMessage.value) {
     console.log('初始化普通消息Map')
-    yMessage.value = docSocket.value.getMap('message')
+    // 必须使用 messageV2:服务器上旧的 message 是 Array 根类型,
+    // 同名再 getMap 会导致根类型冲突、后注册的被改名,observe 间歇性失效
+    yMessage.value = docSocket.value.getMap('messageV2')
     yMessage.value.observe((e: any) => {
       // Map 的 observe 事件中 keysChanged 包含被更新的 key
       if (e.keysChanged.has('latest')) {
@@ -3366,10 +3368,10 @@ const messageInit = () => {
   if (isFirstEnter.value && isCreator.value && docSocket.value) {
     console.log('🧹 首次进入且为创建者,清空所有同步状态')
     docSocket.value.transact(() => {
-      // 清空普通消息(只保留最后一条的逻辑在 sendMessage 中处理)
-      const messageArray = docSocket.value?.getArray?.('message')
-      if (messageArray) {
-        messageArray.delete(0, messageArray.length)
+      // 清空普通消息(Map 结构,最新一条存在 latest key)
+      const messageMapForClear = docSocket.value?.getMap?.('messageV2')
+      if (messageMapForClear) {
+        messageMapForClear.delete('latest')
       }
       // 清空计时器消息数组
       const timerMessagesArray = docSocket.value?.getArray?.('timerMessages')