Почему findOne () не работает в секции withTracker (), а работает в методе render ()? - PullRequest
1 голос
/ 03 февраля 2020

Метеор и Реакция. Я пытаюсь подписать две коллекции mon go и использовать определенный документ для передачи его компоненту. Если я пытаюсь получить документ в разделе whitTracker (), кажется, что он будет искать его до синхронизации документа и будет возвращаться на неопределенный срок. Но, если я сделаю это в разделе рендеринга, убедившись, что isLoading имеет значение false, он работает. Где находится правильное место для поиска данных из коллекций, на которые я подписан?

Это (создание запроса в разделе withTracker) не работает: laLoca и laLoca1 будут неопределенными.

    render() {
        if (this.props.isLoading) {
          return <LoaderExampleText />;
        }        

        return (<MyMap laLoca={this.props.laLoca} />);
      }
    }

    export default withTracker(() => {
      const handles = [
        Meteor.subscribe("wells"),
        Meteor.subscribe("locaciones"),
        Meteor.subscribe("Drylocationlast")
      ];
      const isLoading = handles.some(handle => !handle.ready());
      const laLoca1 = Drylocationlast.findOne({ codigo: "dl" });
      const laLoca = Locaciones.findOne(laLoca1.dryLocationId);

      return {
        laLoca:laLoca,
        wells: Wells.find().fetch(),
        isLoading: isLoading
      };
    })(WellHome);

Но вот это (сделать запрос в методе рендеринга) работает:

    render() {
        if (this.props.isLoading) {
          return <LoaderExampleText />;
        }
        const laLoca1 = Drylocationlast.findOne({ codigo: "dl" });
        const laLoca = Locaciones.findOne(laLoca1.dryLocationId);

        return (<MyMap laLoca={laLoca} />);
      }
    }

    export default withTracker(() => {
      const handles = [
        Meteor.subscribe("wells"),
        Meteor.subscribe("locaciones"),
        Meteor.subscribe("Drylocationlast")
      ];
      const isLoading = handles.some(handle => !handle.ready());

      return {
        wells: Wells.find().fetch(),
        isLoading: isLoading
      };
    })(WellHome);

1 Ответ

0 голосов
/ 04 февраля 2020

Если laLoca1 не определено, laLoca1.dryLocationId будет обрабатывать sh (вы видите ошибку в консоли, верно?), И я предполагаю, что отслеживание не будет настроено правильно.

Когда вы положить:

const laLoca1 = Drylocationlast.findOne({ codigo: "dl" });
const laLoca = Locaciones.findOne(laLoca1.dryLocationId);

в render() после того, как вы проверили, что подписки готовы, они никогда не будут неопределенными, и это будет работать.

Я думаю, что оптимально, render() следует не несет ответственности за выборку данных, только для их визуализации. В withTracker() вы можете сделать что-то вроде этого:

const isLoading = handles.some(handle => !handle.ready());

if(isLoading){
  return {
    laLoca: null,
    wells: null,
    isLoading: true
  };
}else{
  const laLoca1 = Drylocationlast.findOne({ codigo: "dl" });
  const laLoca = Locaciones.findOne(laLoca1.dryLocationId);
  return {
    laLoca: laLoca,
    wells: Wells.find().fetch(),
    isLoading: false
  };
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...