【问题标题】:A subscription on a record doesn't fire when a nested value is changed更改嵌套值时不会触发对记录的订阅
【发布时间】:2015-07-29 09:32:38
【问题描述】:

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

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 为 2 且 id 相同但添加 admin-value 的成员,然后触发 subscribe() 应该注意到的 change-event。

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

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

编辑:

所以我找到了一种使更改触发订阅的方法,即克隆成员,进行更改,然后用新值替换整个成员。但是,文档 (http://deepstream.io/docs/record.html#set( path , value )(对于断开的链接感到抱歉))声明我可以执行 record.set( 'personalData.firstname', 'Marge' );,这只会更新个人数据中的名字。

我知道我正在尝试更改数组的值,这行不通?

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

这是我现在正在使用的解决方法:

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

【问题讨论】:

  • 因此,如果我对需要更改的值进行克隆,请更改克隆上的值,然后将记录的值设置为它会触发订阅的克隆。在我将记录的值保存在变量中之前,更改了该变量并将其重新保存到记录中。

标签: javascript deepstream.io


【解决方案1】:

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

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

应该与:

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

为什么在后台尝试访问存在的东西时,deepstream 使用的 json 路径无法区分普通 js 对象和数组。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-10-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-08-03
    • 1970-01-01
    • 1970-01-01
    • 2012-10-16
    相关资源
    最近更新 更多