3

私は現在 Meteor + React + MongoDB + FlowRouter を使用しています。選択したコースを mycourses に追加したかったのです。

Course.jsx でデータを正常にアップサートして MyCourse に移動しますが、2 回レンダリングされる理由がわかりません。最初はデータがコンソールに正しく出力されましたが、2 回目はデータ find() が空でした[]。

[ { _id: '3nHTJb9gjNWi2JqZL', user_id: 123, course_id: [ 1, 2 ] } ]

client/components/Course.jsx

Course = React.createClass({

    mixins: [ReactMeteorData],

    propTypes: {
        courseId: React.PropTypes.number.isRequired,
    },

    getMeteorData () {
        return {
            currentUser : Meteor.user(),
            courseDetail: AllCoursesCol.findOne({
                id: this.props.courseId
            })
        }
    },

    onPressGetGames(e)
    {
        e.preventDefault()

        if (this.data.currentUser)
        {
            Meteor.call("addToMyCourses", this.props.courseId, (error) => {
                if (error) {
                    console.log("Update Course Failed")
                }
                else {
                    console.log("Update Course Success")
                }
            })
            FlowRouter.go("MyCourses")
        }
        else
        {
            FlowRouter.go("Login")
        }
    },

    render() {
        return (
            <div className="container-fluid">
                <div className="row">
                    <div className="col-sm-8">
                        <div className="embed-responsive embed-responsive-16by9">
                          <iframe className="embed-responsive-item" src="https://www.youtube.com/embed/x0nfdbx0Wls" allowFullScreen></iframe>
                        </div>
                    </div>
                    <div className="col-sm-4">
                        <button btn btn-success onClick={this.onPressGetGames}> Get Games </button>
                    </div>
                </div>
                <div className="row">
                    <h1 className="display-5"> Course Description </h1>
                    <p> {this.data.courseDetail.long_des} </p>
                </div>
            </div>
        )
    }
})

クライアント/コンポーネント/MyCourses.jsx

MyCourses = React.createClass({

    mixins: [ReactMeteorData],

    getMeteorData () {

        return {
            myCoursesId: MyCoursesCol.findOne({user_id: Meteor.userId()})
        }
    },

    render() {

        let displayMyCourses

        if (this.data.myCoursesId)
        {
            displayMyCourses = (
                <div className="card-columns">
                    {
                        this.data.myCoursesId.map((id) => {
                            console.log(id)
                            var course = AllCoursesCol.findOne({id: id})
                            console.log(course)
                            return (
                                <MyCourseCard key={course.id} courseId={course.id} title={course.title} shortDes={course.short_des}/>
                            )
                        })
                    }
                </div>
            )
        }
        else
        {
            displayMyCourses = (
                <h5 className="text-xs-center"> You have no course. Go to Browse Course and get some courses. </h5>
            )
        }

        return (
            <div className="container-fluid">
                {displayMyCourses}
            </div>
        )
    }
})

lib/Router.jsx

FlowRouter.route("/browsecourses/:courseId", {
    name: "Course",
    action (params) {
        renderMainLayoutWith(<Course courseId={parseInt(params.courseId)}/>)
    }
})

FlowRouter.route("/mycourses", {
    name: "MyCourses",
    subscriptions: function() {
        this.register("myCourses", Meteor.subscribe("myCourses"))
    },
    action (params) {
        renderMainLayoutWith(<MyCourses/>)
    }
})

サーバー/publish.jsx

Meteor.publish("myCourses", () => {
    if (!this.userId) {
        throw new Meteor.Error("not-authorized")
    }

    var data = MyCoursesCol.find({user_id: this.userId})

    return data
})
4

0 に答える 0