Meteor, One to Many Relationship e adicionar campo apenas à coleção do lado do cliente em Publish?
Alguém pode ver o que pode estar errado neste código, basicamente eu quero verificar se uma postagem foi compartilhada pelo usuário logado atual e adicionar um campo temporário para a coleção do lado do cliente: isCurrentUserShared.
Isso funciona na primeira vez ao carregar uma nova página e preenchê-la a partir de compartilhamentos existentes ou ao adicionar ou remover um registro da coleção de compartilhamentos SOMENTE na primeira vez que a página for carregada.
1) isSharedByMe somente muda o estado 1 vez, então os callbacks ainda são chamados como por console.log, mas isSharedByMe não é atualizado na coleção Posts após a primeira vez que eu adiciono ou removo um registro. Funciona pela 1ª vez.
2) Por que os callbacks são chamados duas vezes seguidas, isto é, adicionar 1 registro ao Sharescollection dispara 2 chamadas, como mostra o arquivo console.log.
Meteor.publish('posts', function() {
var self = this;
var mySharedHandle;
function checkSharedBy(IN_postId) {
mySharedHandle = Shares.find( { postId: IN_postId, userId: self.userId }).observeChanges({
added: function(id) {
console.log(" ...INSIDE checkSharedBy(); ADDED: IN_postId = " + IN_postId );
self.added('posts', IN_postId, { isSharedByMe: true });
},
removed: function(id) {
console.log(" ...INSIDE checkSharedBy(); REMOVED: IN_postId = " + IN_postId );
self.changed('posts', IN_postId, { isSharedByMe: false });
}
});
}
var handle = Posts.find().observeChanges({
added: function(id, fields) {
checkSharedBy(id);
self.added('posts', id, fields);
},
// This callback never gets run, even when checkSharedBy() changes field isSharedByMe.
changed: function(id, fields) {
self.changed('posts', id, fields);
},
removed: function(id) {
self.removed('posts', id);
}
});
// Stop observing cursor when client unsubscribes
self.onStop(function() {
handle.stop();
mySharedHandle.stop();
});
self.ready();
});