2017-02-15 34 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> 
} 
} 
} 

觀察所需的部件:
$此=這一點;
user = 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, }); 
      } 
     }); 
    }