2015-10-08 29 views
10

Node.jsの電子メールにHTMLテンプレート内でlodashを使用しようとしています。私はいくつかのオブジェクトを持つ1つの配列を持っています。私は各オブジェクトを繰り返し、すべての繰り返し値をリストしたいと思います。下記のコードを使用すると、値が未定義であることを示すエラーが表示されます(例:ReferenceError: firstName is not defined)。 HTMLテンプレートは別のファイルにあります。Lodashで配列内のオブジェクトを反復処理する方法

私が間違っていることについて考えてみましょうか?

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, 
    } 
] 
+0

これらのテンプレートはEJSですか?もしそうなら、それに応じてあなたの質問にタグを付けてください。 – mik01aj

+0

@ m01いいえ、それはちょうどアンダースコアです.jsテンプレート – Magus

答えて

1

あなたのテンプレートにorderInfo[0]を与えるためです。そして、あなたの配列で、orderInfo[0]はちょうどこの部分です:

{ 
    "firstName": "John", 
    "lastName": "Doe", 
    "address": "123 Broadway", 
    "city": "New York", 
    "state": { 
     "code": "NY", 
     "state": "New York" 
    }, 
    "zip": "10001", 
} 

ので、テンプレートが不足している値に反復することはできません。

+0

それを指摘してくれてありがとう。しかし、私は別の何かを間違ってやっているに違いない。 '[0]'を削除すると、アイテムとコストの値に何も表示されないためです。 – Ken

+0

tne [0]を削除すると、テンプレート全体を配列に渡しているので、テンプレートを変更する必要があります。 – Magus

+0

テンプレートを更新しましたが、それでも反復してそれぞれの値を取得できません。助言がありますか? – Ken

9

ここには実際にいくつかの問題があります。テンプレートの構文で開始し、あなただけのテンプレートでforeachのために反復子を指定しているが、我々は、データを必要とイテレータの両方何か

_.forEach(users, function(user){ 

を次のように私はJSON構造Aを更新しているので、また、あなたは、単一のアレイ位置に複数のオブジェクトを持っています少しだけ。

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, 
     } 
    ] 
    } 
] 
}; 

を次のようにマイナーアップデートテンプレート後

いくつかのプロパティが意図的に欠落していると、このようなもの、同じオブジェクトで注文アレイと

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>'); 

とJSONがあるあなたはそれがでここで働いて見ることができますJSBIN

+0

これが機能するにはjson構造を変更する必要がありますか? – Ken

+0

いいえ、そうではありませんが、私はどのように単一の配列位置に複数のオブジェクトを持つことができるのか分かりません。あなたが行うことができる他のものは、名前付きオブジェクトを持つ1つの大きなオブジェクトを作成することですが、再び、1つのオーダーに含まれるオブジェクトの数 –