如何使用多个 JSON 对象进行单个 NodeJS/Jade 合并
How to use multiple JSON objects for single NodeJS/Jade Merge
给定以下设置代码(大致符合实际)
default.js(config.js 用于加载基础配置)
{
"templateData": {
"corp": {
"corpName": "Company",
"DepartmentOne": {
"name": "DepartmentOne",
"phone": "1-800-555-555",
"email": "departmentone@company.com"
},
"address": {
"main": {
"addressLine1": "Somwhere",
"city": "SomeTown",
"stateShort": "SState",
"stateLong": "SomeState",
"zipCodeShort": "Zippy"
}
},
"urls": {
"company": {
"corporate": {
"site": "https://company.com/",
"logo": "http://sites.company.com/images/logo.png",
"altText" : "Company Corporate Logo"
},
"facebook": {
"site": "https://www.facebook.com/company",
"icon": "http://sites.company.com/images/facebook.png",
"altText" : "Company Facebook Page"
},
"twitter": {
"site": "https://twitter.com/company",
"icon": "http://sites.company.com/images/twitter.png",
"altText" : "Company Twitter Feed"
},
"youtube": {
"site": "https://www.youtube.com/company",
"icon": "http://sites.company.com/images/youtube.png",
"altText" : "Company YouTube Channel"
}
}
},
"currentYear": "2015",
"corpWebSiteName": "Company.com"
}
}
}
test01.js(主节点代码)
var fs = require('fs');
var bunyan = require('bunyan');
var jade = require('jade');
var config = require('config');
var restify = require('restify');
var log = bunyan.createLogger({src: false, name: "emailTemplateMerger"});
var html = '';
var corpConfig = config.get('templateData');
var emailData = { 'emailAddress' : 'nonya@bidness.com',
'firstName' : 'nonya',
'lastName' : 'bidness'
}
var miscData = { 'billingDate' : '2015-08-01',
'accountType' : 'new',
'discountTypes' : {
'primary' : 'Coupon20',
'bonus' : 'First30Days',
'standard' : 'freeShipping'
}
}
fs.readFile('./emailTemplates/test01.jade', 'utf-8', function(error, source){
var template = jade.compile(source);
html = template(corpConfig)
console.log(html);
});
翡翠模板:
html
head
body
p.
Hello #{emailData.firstName},
p.
Welcome to #{corp.corpName}'s #{DepartmentOne.name}.
p.
Your next bill will be sent on #{miscData.billingDate} for your #{miscData.accountType}.
p.
Thank you
问题:确定将配置数据和 2 个本地数据集(将通过 REST 传入)合并到 Jade 模板中的有效方法。
由于数据有多层嵌套,直接合并可能很复杂并且可能容易出错,具体取决于传入的数据,是否可以通过 Jade 多个单独的数据集并将合并推迟到 Jade 引擎?
我尝试了多次传递,但是 Jade 合并的一次传递从模板中删除了所有标签,因此没有成功。反正我还没想出链接结果。
您可以像这样创建顶级上下文对象:
var context = {
corp: corpConfig,
email: emailData,
misc: miscData
};
....
var html = template(context);
然后将模板引用更改为类似这样的内容
html
head
body
p.
Hello #{context.email.firstName},
p.
Welcome to #{context.corp.corpName}'s #{context.misc.DepartmentOne.name}.
给定以下设置代码(大致符合实际)
default.js(config.js 用于加载基础配置)
{
"templateData": {
"corp": {
"corpName": "Company",
"DepartmentOne": {
"name": "DepartmentOne",
"phone": "1-800-555-555",
"email": "departmentone@company.com"
},
"address": {
"main": {
"addressLine1": "Somwhere",
"city": "SomeTown",
"stateShort": "SState",
"stateLong": "SomeState",
"zipCodeShort": "Zippy"
}
},
"urls": {
"company": {
"corporate": {
"site": "https://company.com/",
"logo": "http://sites.company.com/images/logo.png",
"altText" : "Company Corporate Logo"
},
"facebook": {
"site": "https://www.facebook.com/company",
"icon": "http://sites.company.com/images/facebook.png",
"altText" : "Company Facebook Page"
},
"twitter": {
"site": "https://twitter.com/company",
"icon": "http://sites.company.com/images/twitter.png",
"altText" : "Company Twitter Feed"
},
"youtube": {
"site": "https://www.youtube.com/company",
"icon": "http://sites.company.com/images/youtube.png",
"altText" : "Company YouTube Channel"
}
}
},
"currentYear": "2015",
"corpWebSiteName": "Company.com"
}
}
}
test01.js(主节点代码)
var fs = require('fs');
var bunyan = require('bunyan');
var jade = require('jade');
var config = require('config');
var restify = require('restify');
var log = bunyan.createLogger({src: false, name: "emailTemplateMerger"});
var html = '';
var corpConfig = config.get('templateData');
var emailData = { 'emailAddress' : 'nonya@bidness.com',
'firstName' : 'nonya',
'lastName' : 'bidness'
}
var miscData = { 'billingDate' : '2015-08-01',
'accountType' : 'new',
'discountTypes' : {
'primary' : 'Coupon20',
'bonus' : 'First30Days',
'standard' : 'freeShipping'
}
}
fs.readFile('./emailTemplates/test01.jade', 'utf-8', function(error, source){
var template = jade.compile(source);
html = template(corpConfig)
console.log(html);
});
翡翠模板:
html
head
body
p.
Hello #{emailData.firstName},
p.
Welcome to #{corp.corpName}'s #{DepartmentOne.name}.
p.
Your next bill will be sent on #{miscData.billingDate} for your #{miscData.accountType}.
p.
Thank you
问题:确定将配置数据和 2 个本地数据集(将通过 REST 传入)合并到 Jade 模板中的有效方法。
由于数据有多层嵌套,直接合并可能很复杂并且可能容易出错,具体取决于传入的数据,是否可以通过 Jade 多个单独的数据集并将合并推迟到 Jade 引擎?
我尝试了多次传递,但是 Jade 合并的一次传递从模板中删除了所有标签,因此没有成功。反正我还没想出链接结果。
您可以像这样创建顶级上下文对象:
var context = {
corp: corpConfig,
email: emailData,
misc: miscData
};
....
var html = template(context);
然后将模板引用更改为类似这样的内容
html
head
body
p.
Hello #{context.email.firstName},
p.
Welcome to #{context.corp.corpName}'s #{context.misc.DepartmentOne.name}.