Meteor Tracker не получает подписки автоматически - PullRequest
0 голосов
/ 18 октября 2019

Я создаю некоторые шаблоны с помощью Template.onCreated, а затем использую Tracker.autorun для создания некоторых подписок, а затем собираю данные с Сервера и сохраняю их на клиентском MiniMongo.

Затем я могуоставь указанный шаблон и в конце концов отправляйся обратно. Тем не менее, я замечаю, что по возвращении Blaze не фиксирует мои изменения. При маршрутизации назад кажется, что onRendered вызывается вместо onCreated. Это имеет смысл, однако, onRendered пока не совсем реагирует на все мои изменения данных. Я заметил это потому, что в minimongo нет данных для onRendered.

Однако я заметил, что он может получить объект путем обновления страницы (таким образом, вызывая onCreated и снова подписываясь и получая новый набор данных с сервера). Мой обходной путь - это повторно подписаться в onRendered, ноЯ чувствую, что не должен был этого делать, потому что я уже изначально подписался на OnCreated. Является ли это проблемой с Meteor, DDP работает медленно?

Допустим, у меня есть некоторая стандартная коллекция по умолчанию, которая называется Objects.

const Objects = new Mongo.Collection("Objects"); 

Так что в моем onCreated я подписываюсь на коллекцию следующим образом

Template.foo.onCreated(function () {
    var self = this;

    self.autorun(function () {
        const objId= FlowRouter.getParam("id");


            self.objectSubscription = Meteor.subscribe('obj', objId, {
                onReady: function () {

                },
                onStop: function (error) {
                    if (error) {
                        alert('error')
                    }
                }
            });

Затем в onRendered я должен взломать его и излишне переподписать, потому что у меня нет objId, т.е. я не могу просто использовать Objects.find (),

Template.foo.onRendered(function () {
    const objId= FlowRouter.getParam("id");

    Meteor.subscribe('obj', objId, {
        onReady: function () {
            $('#obj').addClass('highlight');
        },
        onStop: function (error) {
            if (error) {
                alert('error');
            }
        }
    });

    //I feel like I should just be able to do 
    //const obj = Objects.findOne({_id:objId})
    //$('#obj').addClass('highlight')

});

Любые идеи, почему я теряю данные в минимонго? И это плохая практика, чтобы «переподписаться»?

1 Ответ

1 голос
/ 24 октября 2019

onCreated и onRendered не реагируют, но template helpers. Таким образом, чтобы постоянно обнаруживать изменения в этих двух, вам нужно создать реактивный контекст и поместить его в них, чего можно добиться с помощью Tracker.autorun. Также имейте в виду, что лучше сохранить onRenderd для манипуляций с DOM и onCreated для подписок и создания reactive variables.

Вам не нужны двойные подписки для обнаружения изменений, и IMO, как правило, это плохая практика.

Template.foo.onCreated(function onCreated() {
  const self = this;
  this.autorun(function() {
  const id = FlowRouter.getParam('_id');
  self.subscribe('obj', id);
  });
});


Template.foo.onRendered(function onRendered() {
  const self = this;
  // this will run after subscribe completes sending records to client
  if (self.subscriptionsReady()) {
    // do whatever you want
    $('#obj').addClass('highlight');
  }
});
...