使用Handlebars模板客户端传递的节点JS排序数组

时间:2017-03-18 18:39:54

标签: jquery node.js sorting handlebars.js express-handlebars

我正在使用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的初学者,请耐心等待!

1 个答案:

答案 0 :(得分:0)

您当前的方法是在服务器上执行把手模板,并将生成的字符串作为渲染的html的一部分生成。

你有两个选择 - 重新解释客户端的html,把它放到一个可以排序的数组中,然后尝试将数组重新形成为html ...,或者对服务器进行AJAX调用数据是一个完全在客户端代码中的过程。

第一种方法很棘手,导致代码很难维护。后一种选择要好得多,并为您提供更大的灵活性。

为此,您需要使用res.send或res.json传回数据(请参阅this link for more details而不是res.render。您可以保留对JavaScript代码中传递的原始数据的引用这样你以后就可以进行排序了。

然后,您将要通过向AJAX调用传递对数据的引用来执行您的把手模板客户端(或使用JavaScript进行操作 - 尽管使用把手更容易)。

要完成你想要的东西还有很多工作要做。我将从能够从res.json()调用(或res.send())获取数据开始,并将所获得的数据写入控制台。然后,您可以专注于客户端模板编译和执行。最后,您可以添加脚本代码以便以各种方式对数据进行排序。