如何申请Tracker.autorun?刷新页面

时间:2017-02-15 03:04:06

标签: meteor meteor-accounts meteor-react meteor-tracker

我使用Meteor.userId()和角色限制页面:

class AdminPage extends Component {
render() {
 return (
  <div>
    {
      Roles.userIsInRole(Meteor.userId(), 'admin') ? (
        <Master_Layout renderCenter={<Article_Editor />}/>
      ) : browserHistory.push('/')
    }
  </div>
)
}
}

此代码将用户重定向到&#34; /&#34;刷新后因为Meteor.userId()未定义。在刷新后呈现页面之前,如何确保未定义Meteor.userId()?

我搜索了答案。我发现Tracker.autorun是一个解决方案,但我不明白如何应用它。

谢谢你的帮助。我更新了代码:

constructor(props) {
super(props);

this.state = { user: '' };
}
componentDidMount() {
var $this = this;

Tracker.autorun(function () {
  let user = Meteor.user();
  if(user != undefined) {
    $this.setState({ user: user });
  }
});
}
render() {
if(Roles.userIsInRole(this.state.user, 'admin')) {
  return (
    <div>
      <Master_Layout renderCenter={<Article_Editor />} />
    </div>
  )
} else {
  return <div>loading...</div>
}
}
}

观察到所需部分:
$ this = this;
user = Meteor.user(); //Meteor.userId()不起作用。
删除了browserHistory,因为它会在定义用户之前导航。

现在我只需要在渲染安装之前找到定义user / userId的解决方案。

1 个答案:

答案 0 :(得分:2)

Tracker.autorun允许您在依赖的响应数据源发生变化时自动调用函数。

简单来说,Tracker.autorun()将函数作为输入,现在运行此函数,并在数据源稍后更改时返回。

在您的情况下,您可以使用Tracker.autorun()来跟踪用户文档,因为Meteor.user()Meteor.userId()是被动的。在componentDidMount()调用Tracker.autorun()并在用户文档发生更改时将其保存在其他位置。

希望以下代码段有助于:

componentDidMount() {
        var context = this;

        Tracker.autorun(function(){
            let user = Meteor.user();
            if (user != undefined) {
                context.setState({ user: user, });
            }
        });
    }