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

时间:2015-07-29 09:32:39

标签: javascript deepstream.io

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

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(路径,值)(对于断开的链接抱歉))表明我可以执行record.set( 'personalData.firstname', 'Marge' );,它只会更新personalData中的第一个名字。

我知道我试图改变数组的价值,不会做这项工作吗?

我是否可以仅使用set()来更改对象的值?

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

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

1 个答案:

答案 0 :(得分:1)

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

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

应该使用:

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

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