1

我有以下客户端代码(有两个集合AB):

var id = A.insert({name: 'new element of A');
var b = B.findOne({name: 'parent of new element of A'});
B.update(b._id, { $set: { child: id } });

上面的代码工作正常,即服务器端集合已正确更新。问题发生在客户端上,我有一个模板可以同时对A集合B更改做出反应。

模板的反应如下:

  1. 它基于延迟补偿机制立即重绘自身,显示两个集合的正确更改
  2. 不久之后,它再次重绘自己,但没有更改(好像它们已被拒绝)
  3. 之后它不再自动刷新。但是,如果我点击刷新按钮,模板会再次重绘,现在显示正确更新的集合(AB

在第二次刷新时,只有一个集合(父级B)已更新,并且模板显示不连贯的数据(好像没有发生更新一样)。

我认为这是因为我在这里处理的不是一个同时更新两个集合的事务,从而混淆了客户端模板。

我该如何解决这个问题?

编辑:

我必须补充一点,在我的情况下,我对子数据库有两个补充订阅:

var A = new Meteor.Collection('children');

handle1 = Meteor.subscribe('children1');
handle2 = Meteor.subscribe('children2');

并在服务器上

Meteor.publish('children1', function () {
    return A.find({ sex: male });
}
Meteor.publish('children2', function () {
    return A.find({ sex: female });
}

这可能是当我在 A 中插入一个新元素时,我得到上述奇怪行为的原因吗?

4

1 回答 1

0

如果您在一个命令中完成所有操作,它可能会更好

B.update({name: 'parent of new element of A'}, { $set: { child: A.insert({name: 'new element of A') } });

你必须把它放在一个方法中,因为你不是基于 id 更新

您也可以尝试在操作Deps.flush()后手动调用,这不应该是必需的,但可以尝试

于 2013-04-26T15:02:08.640 回答