Пусть следующий текущий случай:Сервера публикация стороны реактивной Метеор
- У меня есть коллекция «Таблица»
- таблица представляет собой объект со свойствами, как {частное: 0, PRIVATE1, private2, ...} (места 0,1,2 ...)
- Публикация коллекции с двумя аргументами, одна из которых - вторая.
- Учитывая место, публикация будет фильтровать (скрывать) свойства, которые клиент не может видеть.
- Теперь таблицаID и место были взяты из сеанса клиента, поэтому все было реактивным.
- У меня есть метод «takeSeat (seatNb)». Если клиент вызывает этот метод и ему разрешено сидеть за столом, номер места отправляется обратно клиенту, который затем помещает его в свою сессию под ключом сиденья. Это позволит обновить подписку и правильно фильтровать содержимое мест в таблице.
Я не доволен этим дизайном, потому что понял, что клиент может обманывать, подписываясь на сиденье сам по себе. Также (и что более важно) я использую другой клиент DDP в C++ и хотел бы сохранить эту логическую часть на стороне сервера. то есть не нужно подписываться с другим местом, как только я получу его, если я заберусь за стол, я бы хотел, чтобы сервер отображал правильные поля на столе сам по себе.
После нескольких поисков я решил добавить коллекцию в сторону «Игроков», чтобы я мог легко получить уведомление в моей коллекции «таблицы», и добавлен или удален «игрок» в таблицу. Но это только половина проблемы. Мне действительно нужно изменить обработчик самой публикации, чтобы фильтр стал реактивным. Вот где я застрял, вот несколько упрощенных кодов для понимания дела:
Meteor.publish("current-table", function(table_id)
{
var self = this;
var handle = Players.find({"tableID": table_id}).observeChanges(
{
added: function(id)
{
console.log("A player joined the table added");
self.changed("tables", table_id);
},
removed: function(id) {
console.log("A player left the table");
self.changed("tables", table_id);
}
});
self.onStop(function() {
handle.stop();
});
// PUBLISH THE TABLE BUT HIDE SOME FIELDS BEFORE
var player = Players.findOne({"userID": this.userId, "tableID": table_id}) || {"seat": -1};
var seat = player.seat;
var privateFilter = {"private0": false, "private1": false, "private2": false, "private3": false};
delete privateFilter["private" + seat];
return Tables.find(table_id, {fields: privateFilter});
});
Как действовать? Есть ли более элегантный способ достичь этого?
Можете ли вы взглянуть на это так, я думаю, что моя проблема похожа на вашу, но я не уверен, как свести их вместе? http://stackoverflow.com/q/34479708/271873 –
неважно, я это понял :) –