I need to build an email sender by using nodemailer
. I am sending the json object below and want to display the previous and current value changes with a pair of key and value in angular html.
<json input>
async function showChanges(formdata){
let htmlFile = await fs.promises.readFile(templatePath, {
encoding: "utf-8",
});
let template = handlebars.compile(htmlFile);
let templateInput = {
Message_Body: {
Previous: formData.Message_Body.formChanges.Previous,
Current: formData.Message_Body.formChanges.Current,
}
};
return template(templateInput);
}
For example, imagine the formData input looks like:
"Message_Body": {
"formChanges": {
"Previous": {
"Events": "TEST",
"AdditionalInfo": ""
},
"Current": {
"Events": "TEST111",
"AdditionalInfo": "test"
}
}
}
And the html structure in angular looks like:
<div>
<h3>Title: This following has been changed!</h3>
<h3>Previous Values</h3>
<ul>
<li>{{item.key}} : {{item.value}}</li>
</ul>
<h3>Current Values</h3>
<ul>
<li>{{item.key}} : {{item.value}}</li>
</ul>
</div>
How can I loop through the previous and current keys and values and display them as a list?
I am assuming *ngFor
should be used in <div>
tag but it looks like it is applicable only in case of an array..
Can anyone give me any clue please?
I tried adding this code *ngFor="let item of templateInput | keyvalue"
to the following:
<div>
<h3>Title: This following has been changed!</h3>
<h3>Previous Values</h3>
<ul *ngFor="let item of Message_Body.Previous | keyvalue">
<li>{{item.key}} : {{item.value}}</li>
</ul>
<h3>Current Values</h3>
<ul *ngFor="let item of Message_Body.Current | keyvalue">
<li>{{item.key}} : {{item.value}}</li>
</ul>
</div>
And the result is nothing shown (empty)..
My expected result should be:
Title: This following has been changed!
Previous Values:
* Events: TEST
* AdditionalInfo:
Current Values:
* Events: TEST111
* AdditionalInfo: test
2
Answers
This issue is resolved by using
#each
andlookup
helpers inhandlebars.js
. I have opened up another ticket. If anyone wonders the question, please feel free to take a look at the below URL:how to iterate multiple arrays by using handlebars and #each to display values in a table?
Firstly, in your
templateInput
object, you are nesting theMessage_Body
object inside another object with the keyMessage_Body
. This means that in your Angular template, you should access thePrevious
and Current objects using the nestedMessage_Body.Message_Body.Previous
andMessage_Body.Message_Body.Current
paths. To fix this, you can simply remove the outerMessage_Body
key from yourtemplateInput
object:Secondly, in your Angular template, you should use the
templateInput
object as the data source for the*ngFor
directive, not theMessage_Body.Previous
andMessage_Body.Current
objects directly. Here’s how you can modify your template to loop through the key-value pairs and display them: