我正在使用nodeJS,express,MongoDB和Handlebars开发一个简单的Web应用程序。 服务器端我使用快速把手:
var exphbs = require('express-handlebars');
// View Engine
app.set('views', path.join(__dirname, 'views'));
app.engine('handlebars', exphbs(
{
defaultLayout:'layout',
helpers: { /*my helpers*/}}));
因此,当我查询数据库时,我想在页面中向客户端显示结果: / *一些代码* / router.get('/',function(req,res){
/*query to mongo DB with mongoose*/
Coll.find(queryParams, function(err,coll){
if(err) {
console.log(err);
throw err;
}
else {
res.render('index', {'coll': coll});
}
});
使用把手显示结果非常简单:
{{#each coll}}
{{this}}
{{/each}}
但是我想允许用户对这个元素数组进行排序,而不再与服务器进行交互,因为查询结果是相同的并且只会更改顺序。 HTML代码将是:
<select id=id>
<option>sort1</option>
<option>sort2</option>
</select>
{{#each list}}
{{this}}
{{/this}}
<script>
$(document).ready(function () {
$('#id').change(function(){
//DO SOME STUFF WITH LIST
});
</script>
是否存在一种方法来对客户端排序通过res.render(...)传递的数组? 如果用户在select标签中选择一个选项,我可以使用AJAX修改列表吗?如何? (始终不与服务器交互,也不再在mongoDB上执行相同的查询)
PS:我是nodeJS和Handlebars的初学者,请耐心等待!
答案 0 :(得分:0)
您当前的方法是在服务器上执行把手模板,并将生成的字符串作为渲染的html的一部分生成。
你有两个选择 - 重新解释客户端的html,把它放到一个可以排序的数组中,然后尝试将数组重新形成为html ...,或者对服务器进行AJAX调用数据是一个完全在客户端代码中的过程。
第一种方法很棘手,导致代码很难维护。后一种选择要好得多,并为您提供更大的灵活性。
为此,您需要使用res.send或res.json传回数据(请参阅this link for more details而不是res.render。您可以保留对JavaScript代码中传递的原始数据的引用这样你以后就可以进行排序了。
然后,您将要通过向AJAX调用传递对数据的引用来执行您的把手模板客户端(或使用JavaScript进行操作 - 尽管使用把手更容易)。
要完成你想要的东西还有很多工作要做。我将从能够从res.json()调用(或res.send())获取数据开始,并将所获得的数据写入控制台。然后,您可以专注于客户端模板编译和执行。最后,您可以添加脚本代码以便以各种方式对数据进行排序。