当更改嵌套值时,记录上的订阅不会触发

A subscription on a record doesn't fire when a nested value is changed

本文关键字:记录 嵌套      更新时间:2023-09-26

当我更改订阅记录上的嵌套值时,订阅不会被触发。

var recInfo = {};
recInfo.members = [];
recInfo.members.push({id: 1});
recInfo.members.push({id: 2});
recInfo.members.push({id: 3});

的例子:

var record = client.record.getRecord('user/johan');
console.log(record.get());
Output:
{
  name: 'Johan',
  members: [
    {id: 1},
    {id: 2}
  ]
}
record.subscribe((data) => {
  log.debug(LOG_TAG + `Team '${model.name}' has changes. Changes:`, data);
});

现在如果我更新一个用户的值,例如:

record.set('members[1]', {id: 2, admin: true});

我希望记录更改具有相同id的成员id 2,但添加了admin-value,然后触发subscribe()应该注意到的change-event。

更改部分发生了,但它没有触发更改事件,因此订阅永远不会被触发。

我做错了什么吗?如果我添加一个用户,订阅就可以工作。

编辑:

因此,我找到了一种方法来对订阅进行更改,即克隆成员,进行更改,然后用新值替换整个成员。但是,文档(http://deepstream.io/docs/record.html#set(path, value)(对不起,断开了链接)表明,我可以执行record.set( 'personalData.firstname', 'Marge' );,这只会更新personalData中的名字。

我知道我正在尝试改变数组的值,这不会工作吗?

我只能使用set()来改变对象的值吗?

这是我现在使用的变通方法:

var members = lodash.clone(record.get('members'), true);
members[0].admin = true;
record.set('members', members);

我认为问题是由于使用了不同类型的路径表示法。

record.set('members[1]', {id: 2, admin: true});

应该与:

配合使用
record.set('members.1', {id: 2, admin: true});

原因是deepstream使用的json路径在试图访问存在的东西时,不会区分普通的js对象和数组。