1

流星和反应。我正在尝试订阅两个 mongo 集合,并使用特定文档将其传递给组件。如果我尝试在 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);
4

1 回答 1

1

如果laLoca1未定义,laLoca1.dryLocationId则会崩溃(您会在控制台中看到错误,对吗?),我想跟踪将无法正确设置。

当你放:

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
  };
}
于 2020-02-04T12:30:25.080 回答