tdhz77
1
When the page loads I get the ‘posts’ from database in the following order.
But when a user navigates to the module 1 or module 2 (singlePost page) and the user tries to return to the ‘/’ the data gets loaded randomly.
How do I fix this issue? Is this an issue with FlowRouter? My Pub/Sub?
Routes.jsx
…
export default function (injectDeps, {FlowRouter}) {
const MainLayoutCtx = injectDeps(MainLayout);
FlowRouter.route('/', {
name: 'posts.list',
action() {
mount(MainLayoutCtx, {
content: () => (<PostList />)
});
}
});
…
Navigation.jsx:
<Panel bsStyle="primary"><a href={FlowRouter.path('/')}><h1 className="pull-middle">Microsoft Word Training</h1> </a></Panel>
Publish function:
import {Posts, Comments} from '/lib/collections';
import {Meteor} from 'meteor/meteor';
import {check} from 'meteor/check';
export default function () {
Meteor.publish('posts.list', function () {
const selector = {};
const options = {
fields: {_id: 1, title: 1, content: 1, startDate: 1},
sort: {startDate: 1}
};
return Posts.find(selector, options);
});
Meteor.publish('posts.single', function (postId) {
check(postId, String);
const selector = {_id: postId};
return Posts.find(selector);
});
Meteor.publish('posts.comments', function (postId) {
check(postId, String);
const selector = {postId};
return Comments.find(selector);
});
}
Database schema:
"_id": "a9d4dbeb-3b80-4b08-94bb-5d8e41a58dae",
"content": "April 20th: 1:30 - 3:30 PM.",
"title": "Module 1",
"startDate": "1461177000000",
Can you show the source for your <PostList />
component?
tdhz77
3
import React from 'react';
import { Panel, Col } from 'react-bootstrap';
const PostList = ({posts}) => (
<div>
<Col xs={12} md={6} lg={3}>
<div className="text-center">
<Panel header="Instructor Information" bsStyle="primary">
<img src="adsfds.jpg"></img><br/>
<strong>Instructor:</strong> asdfdsfsaf
<br/><strong>asdfdsf</strong><br/>
<p>asdfsdfsadfdsaf</p>
</Panel>
</div>
</Col>
<Col xs={12} md={6}>
<div className='postlist'>
<ul>
{posts.map(post => (
<div key={post._id}>
<div className="client">
<a href={`/post/${post._id}`}><span className="logo">
</span></a>
<h2>
<a href={`/post/${post._id}`}>{post.title}</a>
</h2>
<h3>{post.content}</h3>
</div>
</div>
))}
</ul>
</div>
</Col>
</div>
);
export default PostList;
Thanks - we’ll need to go up a bit higher; can you show where you’re subscribing to your publication, and loading your posts?
You probably forgot to put a sort option on the client-side Posts.find()
tdhz77
6
Thank you! Replaced the Post.find on the client with the proper sort. I can’t believe I missed this. Thank you again! @hwillson and @nlammertyn
import PostList from '../components/postlist.jsx';
import {useDeps, composeWithTracker, composeAll} from 'mantra-core';
export const composer = ({context}, onData) => {
const {Meteor, Collections} = context();
if (Meteor.subscribe('posts.list').ready()) {
const posts = Collections.Posts.find().fetch();
// const posts = Collections.Posts.find({}, {sort: {startDate:1 }}).fetch();
onData(null, {posts});
}
};
export default composeAll(
composeWithTracker(composer),
useDeps()
)(PostList);