我正在研究一個包含發送/取消請求功能的應用程序。 我有以下代碼:Meteor + React,根據用戶的動作顯示特定內容
import React, { Component, PropTypes } from 'react';
import { Events } from '../../api/collections/events.js';
import { Visitors } from '../../api/collections/visitors.js';
import { createContainer } from 'meteor/react-meteor-data';
class Event extends Component {
handleDelete() {
Event.remove(this.props.event._id);
}
requestInvite() {
let eid = Events.findOne(this.props.event._id).title;
Visitors.insert({
visitor_id: Meteor.userId(),
visitor_email: Meteor.user().emails[0].address,
event_name: eid,
})
// did it to debug function, returns correct value
console.log(Visitors.findOne({id: this._id}) + ', ' + Meteor.userId());
}
cancelInvite() {
Visitors.remove(this.props.visitor._id);
}
render() {
const visitor = this.props.visitor.visitor_id;
const length = Visitors.find({}).fetch().length;
return (
<div>
{this.props.event.owner == Meteor.userId() ?
<div>
<img src={this.props.event.picture} />
<span>{this.props.event.title}</span>
<button onClick={this.handleDelete.bind(this)}>Delete</button>
</div>
</div> :
<div>
<div>
<img src={this.props.event.picture} />
<span>{this.props.event.title}</span>
<div>
{ length > 0 && visitor == Meteor.userId() ?
<button onClick={this.cancelInvite.bind(this)}>Cancel Request</button>
:
<button onClick={this.requestInvite.bind(this)}>Request invite</button>
}
</div>
</div>
</div>
}
</div>
)
}
}
Event.propTypes = {
event: PropTypes.object.isRequired,
};
export default createContainer(() => {
return {
event: Events.findOne({id: this._id}) || {},
visitor: Visitors.findOne({id: this._id}) || {},
};
}, Event)
它的工作原理很簡單,這個組件顯示操作按鈕取決於用戶的狀態(如果當前用戶主機這種情況下,它顯示delete
相關的功能,因此一個,我只是不停的就像這個例子那樣簡單)。如果當前用戶不是此活動的主持人,則組件允許此用戶發送(並取消)邀請請求。好吧,一切正常,但只適用於第一個用戶點擊Send Request
按鈕,之後更改爲Cancel Request
(我使用不同的瀏覽器來測試這種情況)。其他用戶也可以點擊Send Request
,但對於他們來說,它不會更改爲Cancel Request
(但它仍然會將正確的文檔添加到Visitors
集合中,同時我還有一個顯示所有訪問者並且數據相關的組件,即ids,電子郵件和事件標題)。我第一次認爲這是findOne
函數的一個問題,但我不這麼認爲,因爲console.log(Visitors.findOne({id: this._id}) + ', ' + Meteor.userId());
的輸出保持正確,給我當前用戶的id和剛創建的訪問者id,這些id在每種情況下都是相同的。我還發現了一個非常奇怪的行爲。當應用程序重新構建時,發送/取消功能就像每個用戶所支持的那樣工作。 我覺得我有點接近解決方案,但需要一點點竅門去做。 任何幫助將不勝感激!
UPD
很明顯,我的問題是不完整的,而不描述該組件創建Visitor
文件。那就是:
{
"_id": "Qbkhm9dsSeHyge4rT",
"visitor_id": "qunyJ4sXNfz2w8qeR",
"visitor_email": "[email protected]",
"event_name": "test",
}
因此,大家可以看到我搶visitor_id
從Meteor.userId()
,這就是爲什麼我使用this.props.visitor.visitor_id
檢查,如果當前登錄的用戶的ID是等於特定訪問者的ID。
解決方案
的問題是與我的查詢中createContainer
功能來獲取訪問者的IDS。我將其更改爲visitor = Visitors.findOne({visitor_id: Meteor.userId()})
,並按照我描述的方式工作。
謝謝你的建議! 我通過附加文檔的模式更新了我的問題。所以你會發現我試圖比較訪問者的ID和當前用戶的ID,這個ID最終改變了按鈕,但是隻有先點擊了「發送請求」按鈕的用戶。 –
嗯。我很確定它與'visitor == Meteor.userId()'不匹配。如果你在聲明'const visitor'之後訪問console.log,你會得到什麼? – NFab
Console.log爲我提供了第一個訪問者的ID,即第一個用戶點擊了「請求邀請」按鈕。當我以另一個用戶身份登錄並點擊此按鈕時,控制檯不會記錄我當前的ID,它會記錄以前的用戶ID。 –