Node.jsの電子メールのHTMLテンプレート内でlodashを使用しようとしています。複数のオブジェクトを持つ1つの配列があります。各オブジェクトを反復処理し、すべての繰り返し値をリストしたいと思います。以下のコードを使用すると、値が未定義であることを示すエラーが表示されます(例:ReferenceError: firstName is not defined
)。 HTMLテンプレートは別のファイルにあります。
私が間違っていることについて何か考えはありますか?
Javascript:
var template = fs.readFileSync('server/views/email-template.html').toString();
var htmlAll = _.template(template)(orderInfo);
HTML:
<% _.forEach(function(firstName) { %><%- firstName %></td><% }); %> <% _.forEach(function(lastName) { %><%- lastName %></td><% }); %>
<% _.forEach(function(address) { %><%- address %></td><% });%>
<% _.forEach(function(city) { %><%- city %><% }); %>, <% _.forEach(function(state.code) { %><%- state.code %><% });
%> <% _.forEach(function(Zip) { %><%- Zip %><% }); %>
<% _.forEach(function(item) { %><td><%- item %></td><% }); %>
<% _.forEach(function(cost) { %><td><%- cost %></td><% }); %>
アレイ:
[
{
"firstName": "John",
"lastName": "Doe",
"address": "123 Broadway",
"city": "New York",
"state": {
"code": "NY",
"state": "New York"
},
"Zip": "10001",
},
{
"color": "White",
"size": "M",
"item": "T-Shirt",
"cost": 19.99,
},
{
"color": "Blue",
"size": "L",
"item": "T-Shirt",
"cost": 19.99,
}
]
実際には、いくつか間違っていることがあります。テンプレート構文から始めて、テンプレートでforeachするイテレータを指定するだけですが、データとイテレータの両方が必要です。
_.forEach(users, function(user){
また、単一の配列位置に複数のオブジェクトがあるため、json構造も少し更新しました。
一部のプロパティが意図的に欠落しているこのようなテンプレートをマイナーアップデートした後、
var tmpl = _.template('<ul><% _.forEach(users, function(user) { %><li><%- user.firstName %></li><li><%- user.address %></li><li><%- user.state.code %></li><li><%- user.state.state %></li><ol> <% _.forEach(user.orders, function(order) { %> <li><span><%- order.item %><span> cost is: <span><%- order.cost %><span></li> <% }); %> </ol> <% }); %></ul>');
同じオブジェクト内のorders配列を持つjsonは次のとおりです
var data = { 'users':
[
{
"firstName": "John",
"lastName": "Doe",
"address": "123 Broadway",
"city": "New York",
"state": {
"code": "NY",
"state": "New York"
},
"Zip": "10001",
"orders": [
{
"color": "White",
"size": "M",
"item": "T-Shirt",
"cost": 19.99,
},
{
"color": "Blue",
"size": "L",
"item": "Pant",
"cost": 19.99,
}
]
}
]
};
ここで [〜#〜] jsbin [〜#〜] で動作していることがわかります
テンプレートにorderInfo[0]
を指定したからです。そして、あなたの配列では、orderInfo[0]
はこの部分にすぎません:
{
"firstName": "John",
"lastName": "Doe",
"address": "123 Broadway",
"city": "New York",
"state": {
"code": "NY",
"state": "New York"
},
"Zip": "10001",
}
そのため、テンプレートは欠損値を反復処理できません。
ES6矢印関数スタイルでこれを行うこともできます。
const users = ['Jack', 'Jill']; _.forEach(users, user => {console.log(user);});