2

我曾经matb33:collection-hooks在插入另一个文档后插入一个文档,是否可以在插入后更新现有文档?我正在尝试执行以下操作:

  • 在模板Box中,其数据上下文具有_idof boxId,调用方法将新文档插入到Targets集合中
  • 获取_id新文档的 并将其添加到具有 的文档的数组_idboxId

由于this引用了钩子中的新文档,我不知道如何获取boxId更新正确的文档。

根据 Pawel 的回答,这里的最终代码:

Template.Box.events({
    'click .add button': function(e) {
        e.preventDefault();

        var currentBoxId = this._id;
        var target = {
            ...
        };

        Meteor.call('targetAdd', target, currentBoxId, function(){});
    }
});

Meteor.methods({
    targetAdd: function(targetAttributes, currentBoxId) {
        check(this.userId, String);
        check(currentBoxId, String);
        check(targetAttributes, {
            ...
        });

        var target = _.extend(targetAttributes, {
            userId: user._id,
            submitted: new Date()
        });

        var targetId = Targets.insert(target);
        Boxes.update(currentBoxId, {$addToSet: {targets:targetId}});

        return {
            _id: targetId
        };
    }
});
4

2 回答 2

0

集合钩子不知道并且不依赖于文档插入/更新的位置(这是集合钩子的要点之一 - 操作来自何处并不重要,钩子应该始终以相同的方式运行)。

更重要的是,即使您的 targetAdd 方法也没有 boxId - 您必须将其作为参数之一传递。

所以在这种情况下,您应该将 boxId 作为参数传递给 targetAdd 方法,并在该方法中修改 box 文档。

仅在收集操作的上下文不重要的情况下使用收集挂钩。

于 2016-01-17T16:57:53.970 回答
0

您可以将 boxId 传递给方法,然后传递给新记录,之后它将出现在挂钩中:

Template.Box.events({
    'click .add button': function(e) {
        e.preventDefault();

        var target = {
            ...
        };

        Meteor.call('targetAdd', target, this._id, function(){});
    }
});

Meteor.methods({
    targetAdd: function(targetAttributes, boxId) {
        check(this.userId, String);
        check(boxId, String);
        check(targetAttributes, {
            ...
        });

        var target = _.extend(targetAttributes, {
            submitted: new Date(),
            boxId: boxId
        });

        var targetId = Targets.insert(target);

        return {
            _id: targetId
        };
    }
});

Targets.after.insert(function () {
    var targetId = this._id;
    var boxId    = this.boxId;
    Boxes.update({_id:boxId}, {$addToSet: {targets: targetId}}, function () {
    }); 
});
于 2016-01-17T19:40:28.527 回答