2016-02-18 2 views
1

В приложении, которое я создаю, есть коллекция игр. Каждый объект в этой коллекции содержит массу данных, связанных с ним. Настолько, что при перечислении игр для каждого пользователя я должен ограничить поля, которые я им отправляю. Это все обычное дело и прекрасно работает. Проблема возникает, когда я хочу получить больше полей для конкретной игры, скажем, когда я иду на ее страницу, мне нужно больше, чем просто описание и имя.Получение дополнительных полей для объекта minimongo с использованием публикации-публикации Meteor

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

Meteor.publish('games', function() { 
    return Games.find({owner: this.userId}, {fields: { 
     name: 1, 
     description: 1 
    }}); 
}); 

//Publish all the fields for the given game 
Meteor.publish('game', function(gameId) { 
    return Games.find({_id: gameId}); 
}); 

Мое понимание публикации подписываться функциональности Метеор является то, что второй публиковать обновит Games minimongo коллекции, давая новые поля объекта в коллекции.

Однако мое понимание кажется ошибочным, или есть что-то с моей реализацией, это неправильно.

Когда я регистрирую коллекцию игр console.log(Games) на странице списка, где я подписываюсь на публикацию «игр». Я получаю то, что я ожидал, коллекцию, содержащую все игры, принадлежащие текущему пользователю. Все документы имеют только имя и описание, как ожидалось.

Когда я иду на страницу игры, где я подписываюсь на «игру». Коллекция неожиданно меняется. Когда я делаю тот же журнал, что и выше, я получаю коллекцию, которая имеет только один объект, но имеет все поля. Это не то, что я ожидал, но он работает для того, что мне нужно.

Проблема возникает после этого. Когда я делаю клиентскую сторону, выберите (ниже) на minimongo collectciton. Я получаю объект, который имеет только описание и имя.

game:() => { 
    return Games.findOne({_id: $stateParams.gameId}); 
} 

Я делаю находку на colleciton, который имеет объект со всеми полями, которые я хочу, но объект избранного возвращаются только имеет два поля я определен заранее.

Я потерялся относительно того, как заставить это работать, и проблемы, возникающие у меня, бросают мое понимание функции публикации подписки в «Метеор» из окна.

я могу добавить некоторые скриншоты объектов коллекции в консоли браузера при необходимости

Любые идеи или предложения попробовать?

EDIT: Вот два лог с моей угловой compenets, который показывает подписываться:

игр: https://gist.github.com/Jiig/f9577469d868a3165221

игр: https://gist.github.com/Jiig/70dce515581ce12beb6f

+0

Вы используете железный маршрутизатор? –

+0

@MichelFloyd Нет, используя ui-router с угловым на клиенте. – Jiig

+0

Все зависит от того, на что вы подписаны, и какой шаблон был отображен (если вы подписались на 'template.onCreated'). Можете ли вы поделиться образцом ваших шаблонов с подпиской? – lucascurti

ответ

1

То, как вы описываете поведение кажется нормальным для меня: ты» подписываясь на коллекцию со всеми предметами, а с другой стороны, вы подписываетесь на подмножество, поэтому «волшебство» Метеор работает против вас здесь.

Есть пару вещей, которые вы можете сделать:

  • подписаться на ОБА подписки на странице только с одной игрой: это позволит предотвратить полный список должны быть очищено, потому что вы не подписались на него , и он будет обновлять только одну игру со всеми ее полями.

  • Разделить Коллекции на Info и Общие параметры: это намного больше проблем для вас, я думаю, но это вариант.

  • Сделайте вызов метода, чтобы получить информацию для одной игры: немного взломанный, но должен работать.

Я думаю, вам стоит просто попробовать первый вариант и посмотреть, как он работает для вас. В любом случае вы должны быть уверены, что остаетесь подписчиком на полную коллекцию, если это длинный список, требующий времени для загрузки.

Удачи.

+0

Спасибо. Я попробовал первое предложение, и теперь коллекция обновляется полями для конкретного объекта, сохраняя при этом все остальные. Однако моя клиентская сторона findOne все еще дает мне объект, который по-прежнему имеет только поля имени и описания. – Jiig

+0

, если вы увидите обновление коллекции, findOne должно вернуть то, что есть. вы уверены, что не фильтруете другие поля в своем запросе? попробуйте find() с идентификатором объекта, если findOne не работает. – MrE

+0

Использование отработанной работы и дает мне правильный объект сейчас, спасибо за вашу помощь. – Jiig