在React

时间:2016-05-26 19:10:54

标签: javascript mongodb meteor reactjs

我正在React.js使用Meteor.js,我正在尝试在React中使用Meteor的subscribe,基于我正在阅读的a blog post。我在这里思考,请纠正我,如果我错了(我是新的反应)是每次数据库更改,特别是wait集合,前端将改变以反映这一点(我最终会找到一个中值)。

但是,我遇到了Meteor.subscribe('wait')的问题,它应该返回mongo集合的选择,但事实并非如此。我相信这会导致我目前收到的错误消息Uncaught TypeError: Cannot convert undefined or null to object。当我记录返回的数据时(如图所示),我刚刚获得undefined。我知道查询有效,因为当我在Meteor.isServer中运行它时,它会从集合中返回一个文档。

那么如何使用getMeteorData(如下所示)从wait集合返回数据,并在有更改(添加新文档等)时更新waitTime DOM对象数据库?

Venue = React.createClass({
  render() {
    var self = this;
    var venueName = this.props.params.venueName;
    return (
      <div className='venue'>
        <h1>This is the Venue {venueName}</h1>
        <WaitTime />
        <div className='wait-time-chooser'>
          <div className="red" onClick={self.waitTime.bind(this,venueName,'red')}>RED</div>
          <div className="yellow" onClick={self.waitTime.bind(this,venueName,'yellow')}>YELLOW</div>
          <div className="green" onClick={self.waitTime.bind(this,venueName,'green')}>GREEN</div>
        </div>
      </div>
    );
  },
  waitTime(currentVenue,time) {
    sendWaitTime(currentVenue,time);
  }
});
function sendWaitTime(venue,time) {
  var userId = Meteor.user()._id;
  $.ajax({
    type: "POST",
    url: "/wait?venue=" + venue + "&wait=" + time + "&user=" + userId,
    success: function(response){
      console.log(response);
    },
    error: function(response){
      console.log("Error:" + JSON.stringify(response));
    }
  });  
}

WaitTime = React.createClass({
  mixins: [ReactMeteorData],
  render() {
    return (
      <div>
        <h3>WAIT TIME: {!$.isEmptyObject(this.data)? this.data.wait : <p>Loading...</p>}</h3>
      </div>
    );
  },  
  componentDidMount() {  
    // wait for task...
  },
  getMeteorData() {
    var data = {};
    var handle = Meteor.subscribe('wait');
    if(handle.ready()) {
      data.wait = Wait.findOne({});
      console.log(data);
    }
    return data;
  }  
});

1 个答案:

答案 0 :(得分:0)

得到它(感谢评论和阅读this Meteor Doc)。不得不在服务器上执行以下操作:

if (Meteor.isServer) {
  Meteor.publish('wait', function waitPublication() {
    return Wait.find();
  });
}

我想我已经删除了autopublishmeteor remove autopublish,默认情况下会附带Meteor。