使用Handlebars.js显示JSON数组
问题描述:
试图使用handlebars.js模板系统从JSON数组中显示雇员数组的全部内容。阵列中的数据没有显示,我不知道为什么。如果答案是显而易见的,我对手柄杆很陌生,所以很抱歉。数据服务是其中函数是由JSON数组填充员工阵列和SERVER.JS是这些函数被调用使用Handlebars.js显示JSON数组
//SERVER.JS
var HTTP_PORT = process.env.PORT || 8080;
var express = require('express');
var data = require('./data-service');
var fs = require('fs');
var app = express();
var path = require('path')
var object = require('./data-service');
var bodyParser = require('body-parser')
var exphbs = require('express-handlebars');
app.use(express.static(__dirname + '/public'));
app.use(bodyParser.urlencoded({extended:true}))
console.log("Express http server listening on 8080");
app.get('/员工”,函数(REQ,RES){
object.getAllEmployees().then((data) =>{
res.render("employeeList", {data: data, title: "Employees"});
}).catch((err) => {
res.render("employeeList", { data: {}, title: "Employees" });
})
//DARA-SERVICE.JS
var employees = [];
var departments = [];
var empCount = 0;
var error = 0;
var fs = require("fs");
function initialize(){
employees = fs.readFileSync("./data/employees.json", 'utf8', function(err, data){
if(err){
error = 1;
}
empCount = employees.length;
employees = JSON.parse(data);
});
departments = fs.readFileSync("./data/department.json", 'utf8', function(err, data){
if(err){
error = 1;
}
departments = JSON.parse(data);
});
}
function check() {
return new Promise(function(resolve,reject){
if (error === 0){
resolve("Success");
}
else if(error === 1){
reject("unable to read file");
}
})
};
var getAllEmployees = function(){
return check().then(function(x){
console.log(x);
console.log(employees);
return employees;
}).catch(function(x){
console.log("No results returned");
});
}
module.exports.getAllEmployees = getAllEmployees;
车把
<div class = "row">
<div class="col-md-12">
<h1>
{{title}}
<a href="/employees/add" class = "btn btn-success pull-right" style="margin-top:5px;">Add New Employee</a>
</h1>
<hr />
</div>
</div>
<div class = "row">
<div class = "col-md-12">
<div class = "table-responsive">
<table class ="table">
<thead>
<tr>
<th>Employee Num</th>
<th>Full Name</th>
<th>Email</th>
<th>Address</th>
<th>Manager ID</th>
<th>Status</th>
<th>Department</th>
<th>Hired On</th>
<th></th>
</tr>
</thead>
<tbody id="names" class="collection with-header">
{{#each data}}
<tr class="collection-item">
<td>{{{employeeNum}}}</td>
{{!-- TODO: search employee name --}}
<td><a id = "employeesName" href="/employee/{{employeeNum}}">{{firstName}} {{last_name}}</a></td>
<td><a href="mailto:{{email}}">{{email}}</a></td>
<td>{{addressStreet}} {{addresCity}} {{addressState}} {{addressPostal}}</td>
<td><a href="/employees?manager={{employeeManagerNum}}">{{employeeManagerNum}}</a></td>
<td><a href="/employees?status={{status}}">{{status}}</a></td>
<td><a href="/employees?department={{department}}">{{department}}</a></td>
<td>{{hireDate}}</td>
<td><a href="/employee/delete/{{employeeNum}}" class="btn btn-danger">remove</a></td>
</tr>
{{else}}
<tr>
<td>No Data Available</td>
<td></td>
<td></td>
<td></td>
<td></td>
<td></td>
<td></td>
<td></td>
<td></td>
</tr>{{/each}}
</tbody>
</table>
<table style="display:none">
<tbody id="department-names">
{{#each departmentTitle}}
<tr class="collection-item-department">
<td>{{departmentName}}</td>
</tr>
{{/each}}
</tbody>
</table>
<div>
<canvas id="myChart" width="20%" height="20%" style="display: block; height: 50%; width: 50%;"></canvas>
</div>
</div>
</div>
</div>
答
当使用each
,则需要使用this
从数组引用对象。所以你的车把看起来应该是这样的:
{{#each data}}
<tr class="collection-item">
<td>{{this.employeeNum}}</td>
...
似乎不起作用 – Workkkkk
Doh!抱歉!您是否确实将您从data-service.js中的文件收集的数据传递到模板的上下文中?在你的server.js中,它看起来像只是简单地拉动数据(除非你已经发布了一个简化的代码版本) – Cromulent
我已经更新了它,包括所有涉及显示员工 – Workkkkk