Как применить Tracker.autorun? Meteor.userId() undefined сразу после обновления страницы

У меня есть страница с ограниченным доступом, использующая Meteor.userId() и роли:

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

Этот код перенаправляет пользователя на «/» после обновления, потому что 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;
пользователь = Meteor.user(); //Meteor.userId() не работает.
удалена история браузера, потому что она уйдет до того, как пользователь будет определен.

Теперь мне просто нужно найти решение по определению user/userId перед монтированием рендеринга.


person Meteor_UN666    schedule 15.02.2017    source источник


Ответы (1)


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, });
            }
        });
    }
person Mostafiz Rahman    schedule 15.02.2017