javascript - 循环嵌套 Handlebars 导入数组中的特定元素时出现问题

标签 javascript html arrays node.js handlebars.js

<div class="sub_container">
<div class="logo-col"> </div>
<h2>Welcome to {{title}}</h2>
<script>

    function showDiv() {
        var Displayobj = "";
        var Finalobj = "";
            for (var i = 0; i < "{{projects.length}}"; i++) {
            Displayobj="{{projects.[i].[0]}}"+"'s current value is "+"{{projects.[i].[2]}}";
            Finalobj = Finalobj + "  |||  "+Displayobj;
            }
        document.getElementById('contentdiv').innerHTML = Finalobj;
        document.getElementById('contentdiv').style.display = "block";

}
    </script>

    <input type="button" value="Value per Item" id="MyButton" onclick="showDiv()" /> 
    <button type="button">Value per Center</button><button type="button">Amount of projects</button><button type="button">Potential of projects</button>
    <div id = "contentdiv" style = "display:none;" class="sub_cnt_col" >
    </div>

我要做的是指定 Handlebars 数组的哪些元素

 {{projects}}

根据我单击的按钮显示。现在我只完成了一个按钮,但是“{{projects.[i].[0]}}
什么都不返回。在网页上我看到:

||| 's current value is ||| 's current value is ||| 's current value is
.  

但是如果我为“i”输入一个数字,例如 0,它就可以正常工作,但我需要它来遍历所有实例。
projects 包含这样的数组 ---->

projects=[[Computer,info,50],[Desk, info, 10],[Plane, info, 450]]  

编辑: {{projects[i][0]}} 不起作用 ---> 它只是下载一个空的 TextEdit 文件

编辑:我也发现了这个--->
<ul class="people_list"> {{#each projects}} <li>{{this}}</li> {{/each}} </ul>
但问题是它不显示特定元素。 AKA:项目应该只显示第一个和第三个元素,我不知道如何用这个 handlebars 助手指定。

编辑: 更奇怪的事情:如果我把它改成 {{projects[i][0]}}在网站的控制台中它显示加载资源失败:框架加载中断,即使我没有加载任何东西。

编辑:当我做 {{project[0][0]}}并在没有 for 循环的情况下对其进行硬编码,它可以正确获取所有内容,因此它必须专门与 for 循环有关,而不是无法访问数组。

编辑: 我想通了,我在 for 循环之外创建了另一个变量并将其命名为 i我注释掉了 for 循环,但它仍然不起作用,这意味着问题出在数组中,由于某种原因无法使用变量作为其索引。 仍然没有修复

编辑: 我的问题可能与缺少模板有关,因为我从未创建过模板,老实说也不一定知道如何创建。

编辑: 我的问题可能是我正在尝试使用 javascript 而不是 HTML 来遍历它,就像 chiliNUT 示例中的人使用的那样。但是我不知道如何只用 HTML 指定 1 个项目。

编辑:

   var indexController = {
    index:function(req, res){
        var data = {
            title: "whatever"
        };
        var exphbs  = require('express-handlebars');  
var hb = require('handlebars');
    // Creates the access token and uses the smartsheetSDK
    // specifies which sheet to go into
    var options = {
        id: 
    };
    var http = require('http');
    var rowIds = [];
    var dupcities = [];
    var cities = [];
    var projects = [];
    var finrow=0;
    var moneyDone = 0;
    var sheetRowlength=0;
    var ProjectsSortedintoCity=[];
    var moneymade=0;
    var ProjperCit = 0;
    // Gets the specific row
    /* jshint loopfunc:true */
    smartsheet.sheets.getSheet(options)
        .then(function (data0) {
            //gets the entire sheet, but only the rowIds are used
            for (var i = 0; i <= data0.rows.length-1;i++) {
                rowIds.push(data0.rows[i].id);
                //pushes/prints the row ids
                sheetRowlength =(data0.rows.length);
                options= {sheetId: 
                          rowId: data0.rows[i].id};
                          //sets a new options for the rows
                    //gets the row

                smartsheet.sheets.getRow(options)
                .then(function (data1) {
                     projects.push([]);
                        for( var b = 0; b < data1.cells.length; b++){
                        projects[finrow].push(data1.cells[b].value);
                    //prints out all the values of the row

                    }
                    dupcities.push(projects[finrow][4]);
                    finrow++;
                    if(projects.length===sheetRowlength){
                        var cities = dupcities.slice() // slice makes copy of array before sorting it
                         .sort(function(a,b){
                                return a > b;
                              })
                              .reduce(function(a,b){
                                if (a.slice(-1)[0] !== b){ a.push(b);}// slice(-1)[0] means last item in array without removing it
                                return a;
                              },[]);
                            for (var z = 0; z <cities.length; z++) {
                                ProjectsSortedintoCity.push([]);
                                ProjectsSortedintoCity[moneyDone].push(cities[z]);
                                for (var x= 0; x <projects.length; x++) {
                                    if(projects[x][4]===ProjectsSortedintoCity[moneyDone][0]){
                                    ProjperCit++;
                                     moneymade=moneymade+projects[x][40]+projects[x][41]+projects[x][42]+projects[x][43];
                                }
                                }
                                ProjectsSortedintoCity[moneyDone].push(moneymade);
                                ProjectsSortedintoCity[moneyDone].push(ProjperCit);
                                moneyDone++;
                                moneymade=0;
                                ProjperCit=0;

                            }

                        data.projects=ProjectsSortedintoCity;
                        data.cities=cities;
                        system.loadView(res,'index', data);

                    }


            })
            .catch(function (error){
                    console.log(error);
                    data.error=true;
                    system.loadView(res,'index', data);
                });
        }
            console.log("HIIIIELO");

        })
        .catch(function (error) {
            console.log(error);
            data.error=true;
            system.loadView(res,'index', data);
        });


    // load index view from views, with passed data
}
};

// add controller functions to exports
module.exports = indexController;

最佳答案

如果您不能像那样访问数组,请尝试为 Handlebars 制作助手。

var exphbs  = require('express-handlebars');  
var hb = require('handlebars');

app.engine('handlebars', exphbs({
        layoutsDir: 'yourDir',
        defaultLayout: 'main',
        partialsDir: ['/views/partials/'],
        helpers: {
          formatText: function(data) {
            var sendData = '';
            //your function for formating data
            //fill 'sendData' with html how u wanna type it in HTML
            return new hb.SafeString(sendData);
          }
        }
      }));
app.set('views', config.root + '/app/views');
app.set('view engine', 'handlebars');

然后在你的 file.hbs 中输入..

{{ formatText projects }}

这个项目是参数,你正在向那个函数发送整个数据。

关于javascript - 循环嵌套 Handlebars 导入数组中的特定元素时出现问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38533498/

相关文章:

html - 列表项下的样式跨度类

javascript - 回文检查器问题

arrays - Matlab:通过扩展其向量来扩展矩阵

ios - 将 Sprite 节点添加到可变数组中

javascript - 使用 Firebase Cloud Functions 将值从一个节点复制到多个其他节点

javascript - HTML5 checkValidity 表示空输入有效

javascript - 谷歌地图上的 getBounds() 不准确?

c - 如何清理此代码以将日期转换为一周中的某一天?

文本输入值中的 JavaScript 变量

javascript - 删除数组中等于后续参数的值