私はブログアプリケーションに取り組んでいます(リンクをクリックしてGitHubrepo) Express 、 [〜#〜] ejs [〜#〜] およびMongoDBを使用します。
投稿用のシンプルなポケットベルを作成しました。
記事ではcontroller私が持っています:
_exports.getPosts = async (req, res, next) => {
const posts = await Post.find({}, (err, posts) => {
const perPage = 10;
const currPage = req.query.page ? parseInt(req.query.page) : 1;
const postsCount = posts.length;
const pageCount = Math.ceil(postsCount / perPage);
const pageDecrement = currPage > 1 ? 1 : 0;
const pageIncrement = currPage < pageCount ? 1 : 0;
if (err) {
console.log("Error: ", err);
} else {
res.render("default/index", {
moment: moment,
layout: "default/layout",
website_name: "MEAN Blog",
page_heading: "XPress News",
page_subheading: "A MEAN Stack Blogging Application",
currPage: currPage,
pageDecrement: pageDecrement,
pageIncrement: pageIncrement,
posts: posts,
});
}
})
.sort({ created_at: -1 })
.populate("category")
.limit(perPage)
.skip((currPage - 1) * perPage);
};
_
ビューのポケットベル:
_<% if (posts) {%>
<div class="clearfix d-flex justify-content-center">
<div class="px-1">
<a class="btn btn-primary <%= pageDecrement == 0 ? 'disabled' : '' %>" href="/?page=<%= currPage - pageDecrement %>">← Newer Posts</a>
</div>
<div class="px-1">
<a class="btn btn-primary <%= pageIncrement == 0 ? 'disabled' : '' %>" href="/?page=<%= currPage + pageIncrement %>">Older Posts →</a>
</div>
</div>
<% } %>
_
コントローラーからの行.limit(perPage)
は、コンソール(Git bash)でエラー_perPage is not defined
_を示します。
明らかに、これらの2行を_const posts
_の上に移動できます
_const perPage = 5;
const currPage = req.query.page ? parseInt(req.query.page) : 1;
_
できません_const postsCount = posts.length;
_(ビューでも必要です)と同じことができます.
ページネーションに関するコードのスニペットreusableを作成しようとしています(可能な場合はプラグインのように)。カテゴリ、およびアプリケーションの管理セクションにある投稿のリスト。
何が悪いのですか?
他のコメントで説明したように。これはスコープの問題である可能性があります。
exports.getPosts = async (req, res, next) => {
const perPage = 10; // enable you to use perPage inside getPosts()
let postsCount = 0; // let, to enable you to use/reassigned postsCount inside getPosts()
const posts = await Post.find({}, (err, posts) => {
// ...
postsCount = posts.length; // updates the variable with the correct count
// ...
if (err) {
console.log("Error: ", err);
} else {
res.render("default/index", {
//...
posts: posts,
postsCount: posts.length, // for explicit postsCount in the view
});
}
});
// ..
あなたのビューには既にposts
があるので、ビューのpostsCountに問題があります
<% if (posts) {%>
...
<% } %>
posts.length
またはpostsCounts
は、他のユーザーの使用方法(たとえば、pageIncrement、currPage、pageIncrement);のようなビューで使用します。
多分このコンポーネントをチェックすれば、それがどのように機能するかを見ることによってあなたの問題を解決することができます
$ npm install mongoose-paginate
/**
* querying for `all` {} items in `MyModel`
* paginating by second page, 10 items per page (10 results, page 2)
**/
MyModel.paginate({}, 2, 10, function(error, pageCount, paginatedResults) {
if (error) {
console.error(error);
} else {
console.log('Pages:', pageCount);
console.log(paginatedResults);
}
}
私が最近気付いたように、_postsCount = posts.length
_は投稿をカウントしますafterは.skip((currPage - 1) * perPage)
によって制限されるため、pageIncrement
変数の「式」は次のようになります。
_let pageIncrement = postsCount >= perPage ? 1 : 0;
_
だから私はコントローラで得ます:
_exports.getPosts = async (req, res, next) => {
const perPage = 5;
const currPage = req.query.page ? parseInt(req.query.page) : 1;
let postsCount = 0;
const posts = await Post.find({}, (err, posts) => {
postsCount = posts.length;
let pageDecrement = currPage > 1 ? 1 : 0;
let pageIncrement = postsCount >= perPage ? 1 : 0;
if (err) {
console.log('Error: ', err);
} else {
res.render('default/index', {
moment: moment,
layout: 'default/layout',
website_name: 'MEAN Blog',
page_heading: 'XPress News',
page_subheading: 'A MEAN Stack Blogging Application',
currPage: currPage,
posts: posts,
pageDecrement: pageDecrement,
pageIncrement: pageIncrement
});
}
})
.sort({
created_at: -1
})
.populate('category')
.limit(perPage)
.skip((currPage - 1) * perPage);
};
_
そしてビューでは:
_<a class="btn btn-primary <%= pageDecrement == 0 ? 'disabled' : '' %>" href="/?page=<%= currPage - pageDecrement %>">← Newer Posts</a>
_
そして
_<a class="btn btn-primary <%= pageIncrement == 0 ? 'disabled' : '' %>" href="/?page=<%= currPage + pageIncrement %>">Older Posts →</a>
_
_perPage x N
_に等しい数の投稿がない限り、これはうまく機能します。Nは整数です。この場合、[古い投稿]ボタンが1ページ遅れて無効になります。