Добавить идентификатор нового документа в массив в существующем документе, используя коллекционные хуки

Я использовал matb33:collection-hooks вставить документ после вставки в другой, возможно ли обновить существующий документ после вставки? Я пытаюсь сделать следующее:

  • в шаблоне Boxчей контекст данных имеет _id из boxIdвызовите метод для вставки нового документа в Targets коллекция
  • получить _id нового документа и добавить его в массив документа с _id из boxId,

поскольку this ссылается на новый документ в крючке, я не могу понять, как получить boxId обновить нужный документ.

Окончательный код здесь в ответе Павла:

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
        };
    }
});

2 ответа

Решение

Хуки-сборщики не знают и не зависят от того, где документ был вставлен / обновлен (это одна из точек хуков сбора - не имеет значения, откуда происходит операция, хук всегда должен вести себя одинаково).).

Более того, даже у вашего метода targetAdd еще нет boxId - вам придется передать его в качестве одного из параметров.

Поэтому в этом случае вы должны передать boxId в качестве параметра методу targetAdd и изменить документ box в методе.

Используйте ловушки сбора только в тех случаях, когда контекст операции сбора не важен.

Вы можете просто передать 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 () {
    }); 
});
Другие вопросы по тегам