#786·yjs

从 Y.Map 中删除非空的 Y.Map 子元素会触发 YMapEvent,其中 `oldValue` 为 **空 Y.Map**。

作者: WebCoder49创建于 2026年7月9日更新于 2026年7月11日
标签bug

请节省一些时间并使用以下模板。 在90%的问题里,我无法再现这个问题,因为我不知道你到底在做什么, 在哪个环境中,或者哪个y*版本负责。 尽管你认为问题很明显,但还是使用以下模板。

** 核对清单**

** 描述错误** `YMapEvent.oldValue'是YMap在从它嵌入的YMap父母中删除一个非空的YMap孩子时的"空".

** 废除** 复制行为的步骤 :

  1. 安装YJS版本 13.6.31
  2. 撰写此文件`test.mjs':
* 从“yjs”导入为Y;

const ydoc = 新的 Y.Doc ()
缩写为 ymap = ydoc.getMap ("map");

ymap.observate( ymapEvent {{} ) 页面存档备份,存于互联网档案馆
//样本代码.
ymapEvent.changes.keys.forEach ((change, key)) {{(change, key){
如果(更改. action ++ “ 添加” ) {
cope.log('ymap: property "${key}"被添加. 初始值 : `, ymap.get( key).toJSON ()
} 如果( 更改. 动作 } { 更新 } {
contail.log('ymap: property "${key}"被更新. 新值:"${ymap.get(key)}". 上一个数值:`,change.oldValue'
{ 如果( 更改. 动作 } “ 删除 ”){
contail.log('ymap: property "${key}"被删除. 新值:未定义. 上一个数值:`,change.oldValue.toJSON ()
{\fn黑体\fs22\bord1\shad0\3aHBE\4aH00\fscx67\fscy66\2cHFFFFFF\3cH808080}你觉得呢?
) (中文(简体) ).
) (中文(简体) ).

const ymap2 = 新 Y.Map ();

ymap2. 观察( ymapEvent {{})
//样本代码.
ymapEvent.changes.keys.forEach ((change, key)) {{(change, key){
如果(更改. action ++ “ 添加” ) {
cope.log('ymap2: property "${key}"被添加. 初始值 : `, ymap.get( key).toJSON ()
} 如果( 更改. 动作 } { 更新 } {
control.log('ymap2: property "${key}"被更新. 新值:"${ymap.get(key)}". 上一个数值:`,change.oldValue'
{ 如果( 更改. 动作 } “ 删除 ”){
control.log('ymap2: property "${key}"被删除. 新值:未定义. 上一个数值:`,change.oldValue.toJSON ()
{\fn黑体\fs22\bord1\shad0\3aHBE\4aH00\fscx67\fscy66\2cHFFFFFF\3cH808080}你觉得呢?
) (中文(简体) ).
) (中文(简体) ).

ymap2. set("你好","世界")

ymap.set("键", ymap2)
ymap.delete ("键")
  1. 运行 'node test.mjs' (但这个错误也发生在网页浏览器上,并附有y-websocket和y-indexeddb)
  2. 在控制台上看到这一点: [JavaScript] ymap:增加了属性"键". 初始值 : {你好:"世界"} ymap:属性"键"被删除. 新值:未定义. 上一个值 :
(不正确, 因为如果从 YMap 中删除 “ 你好 ” , 那么它会首先作为日志出现 。 )

** 预期行为**
```2ZZ
ymap:增加了属性"键". 初始值 : {你好:"世界"}
ymap:属性"键"被删除. 新值:未定义. 上一个值 : {你好:"world"}

** 枪声** 不适用。

** 环境信息**

  • 浏览器 / Node.js Node.js 或铬或火狐
  • Yjs版本:13.6.31

** 其他情况** 我今晚要离开 . . . . . . .