【发布时间】:2018-12-21 01:58:25
【问题描述】:
我正在开发一个 NodeJS 项目,使用 Firebase 作为后端,NodeJs 作为服务器端,EJS + HTML + JS + CSS 作为前端。
在我的主屏幕上,我有一个 3 列的砌体网格,用于显示我正在显示的图像;类似于 pinterest。我还在网格底部有一个添加更多按钮,该按钮向 api 发送请求以检索更多图像以显示在页面上。
方法一:
我有 40 张图片。
在我的路线中,我将从 Firebase 检索数据,然后使用数据渲染 ejs 视图。我想加载前 20 张图像。 优点:它允许我在页面上的所有内容具有正确的样式,并且可以与网格的样式一起使用;如果图像高度不同,网格布局会相应地调整内容。 缺点:我不知道如何处理分页以每隔 5 次加载剩余图像。
这里是sn-ps的代码:
NodeJS:
router.get('/home', function(req, res { firObj.database().ref('igrushi/content').orderByKey().limitToLast(14).once('value', function (snapshot) {
res.status(200).render('igrushiexperience/index', {
title: "",
data: snapshot.val(),
});
});
ejs =>
<div class="portfolio portfolio-gutter portfolio-style-2 portfolio-masonry portfolio-not-full portfolio-3-column">
<% var keys; %>
<% var lastKey; %>
<% if (data != null) { %>
<% keys = Object.keys(data); %>
<% console.log(keys); %>
<% lastKey = keys[0]; %>
<% keys.forEach(function(child) { %>
<% var value = data[child] %>
<div class="portfolio-item cat-1 cat-3 ">
<div class="portfolio-item-content">
<div class="item-thumbnail">
<img src="<%= value.post_image %>" alt="" >
</div>
</div>
</div>
<% }); %>
<% }; %>
</div>
<div class="pagination-area">
<div class="load-more text-center">
<a class="button" href="/events/igrushiexperience/pagination/<%= lastKey %>">view more<i class="ti-reload"></i></a>
</div>
</div>`
方法 2: 我有 40 张图片。
在我的路由中,我将呈现 ejs 视图,我的 EJS 将包含一个 XMLHttpRequest 到另一个获取数据的节点 js 端点。获取数据后,我使用 appendChild 创建 DIV 并将项目添加到网格中。
Pro:这种方法允许我的分页请求成功并继续以 5 项间隔获取和呈现数据。 缺点:CSS 样式不成立,网格不针对不同的高度进行调整。
这里是sn-p的代码:
html =>
<div class="portfolio-fullwidth">
<div class="portfolio-content">
<div id="gallery" class="portfolio portfolio-gutter portfolio-style-2 portfolio-masonry portfolio-full portfolio-3-column">
</div>
<div class="pagination-area">
<div class="load-more text-center">
<a class="button" onClick="pagination(this)">view more<i class="ti-reload"></i></a>
</div>
</div>
</div>
</div>
js:
<script>
var keys;
function retrieveData() {
var request = new XMLHttpRequest();
request.onreadystatechange = function() {
if (this.readyState == 4 && this.status == 200) {
var posts = JSON.parse(this.responseText);
keys = Object.keys(posts);
keys.forEach(function(id) {
var post = posts[id];
addItemToGallery(post);
});
console.log(keys);
};
};
request.open("GET", "/events/igrushiexperience/retrievePosts", true);
request.send();
}
function pagination(e) {
var keyForPagination;
if (keys.length > 0) {
keyForPagination = keys[keys.length - 1];
} else {
return retrieveData();
}
console.log(keyForPagination);
var request = new XMLHttpRequest();
request.onreadystatechange = function() {
if (this.readyState == 4 && this.status == 200) {
var posts = JSON.parse(this.responseText);
var paginationKeys = Object.keys(posts);
paginationKeys.forEach(function(id) {
if (!keys.includes(id)) {
keys.push(id);
var post = posts[id];
addItemToGallery(post);
}
});
console.log("New Array: ", keys);
};
};
request.open("GET", "/events/igrushiexperience/pagination/"+ keyForPagination, true);
request.send();
}
function addItemToGallery(post) {
var divOne = document.createElement("div");
divOne.className = "portfolio-item cat-1 cat-3";
var divTwo = document.createElement("div");
divTwo.className = "portfolio-item-content";
var divThree = document.createElement("div");
divThree.className = "item-thumbnail";
var image = document.createElement("img");
image.src = post.post_image;
divThree.appendChild(image);
divTwo.appendChild(divThree);
divOne.appendChild(divTwo);
document.getElementById("gallery").appendChild(divOne);
}
retrieveData();
</script>
请帮忙
【问题讨论】:
标签: javascript css node.js html ejs