2017-02-15 17 views
0

У меня есть запретная страница с помощью Meteor.userId() и роль:Как применить Tracker.autorun? 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> 
} 
} 
} 

Наблюдаемые необходимые детали:
$ это = это;
пользователь = Meteor.user(); //Meteor.userId() не работает.
удален browserHistory, потому что он будет перемещаться до пользователя.

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

ответ

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, }); 
      } 
     }); 
    } 

 Смежные вопросы

  • Нет связанных вопросов^_^