React

时间:2016-05-16 08:37:22

标签: mongodb meteor reactjs meteor-react

我试图通过将集合名称作为prop来编写一个React组件来订阅服务器上的数据。 (在示例中,名称仍然是硬编码以保持简单)由于集合名称可以动态更改,因此我调用方法来构造发布和服务器集合变量。现在的理论是在父组件中构造数据发布,服务器和客户端mongo集合变量,并在子组件中订阅此发布。父组件的设置如下:

    export default class TilesSingle extends TrackerReact(Component) {
      newDataCollection(){
        Meteor.call("setupData","randomcollectionname");
        if(!window["randomcollectionname"]){
          window["randomcollectionname"] = new Meteor.Collection("randomcollectionname");
        }
      }
      render(){
        this.newDataCollection();
        return(
          <div>
            <DataObject />
          </div>
        )
      }
    }

setupData方法如下所示:

Meteor.methods({
    setupData(collectionname){
      if(!global[collectionname]){
        global[collectionname] = new Meteor.Collection(collectionname);
        Meteor.publish("pub."+ collectionname,function() {
          return global[collectionname].find();
        });
      }
    }
})

子DataObject组件如下所示:

    export default class DataObject extends TrackerReact(Component) {
      constructor(){
        super();
        this.state = {
          subscription: {
            tiledata: Meteor.subscribe("pub.randomcollectionname"),
          }
        }
      }
      componentWillUnmount(){
        this.state.subscription.tiledata.stop();
      }
      findData(){
        post = window['randomcollectionname'].findOne();
        console.log(post)
        return post;
      }
      render(){
        obj = this.findData();
        if(!obj){
          obj = {};
          obj["score"] = 0;
        }
        return(
          <div>
            <h4>{obj.score}</h4>
          </div>
        )
      }
    }

请注意,我在findData()函数中记录了帖子。刷新时,控制台会记录:

undefined
undefined
> Object {..}
> Object {..}
undefined
undefined

这几乎就像订阅有效,然后停止工作。我认为它与响应呈现这些组件的顺序有关,并且在客户端尝试呈现子组件时,该方法尚未在服务器上完成。任何想法?

0 个答案:

没有答案