Добавить идентификатор нового документа в массив в существующем документе, используя коллекционные хуки
Я использовал 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 () {
});
});