如何在同一个事务中更新Meteor中的多个集合?

时间:2013-04-26 11:05:49

标签: meteor

我有以下客户端代码(包含两个集合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 } });

上述代码工作正常,即服务器端集合已正确更新。问题发生在客户端上,我的模板会对AB集合更改做出反应。

模板的反应如下:

  1. 根据延迟补偿机制立即重新绘制,显示两个集合的正确更改
  2. 不久后,它再次重新绘制,但没有更改(好像它们被拒绝了)
  3. 之后不再自动刷新。但是,如果我点击刷新按钮,模板会再次重绘,现在会显示正确更新的集合(AB
  4. 在第二次刷新时,只有一个集合(父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中插入一个新元素时,我得到了上面描述的奇怪行为吗?

1 个答案:

答案 0 :(得分:0)

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

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

你必须把它放在一个方法中,因为你没有根据id

进行更新

你也可以尝试在操作之后手动调用Deps.flush(),这不应该是需要的,但是要尝试一下