javascript - 使用 Typescript Angular 动态替换字符串
问题描述
我正在尝试创建一封录取通知书,它将某些占位符替换为从列表中选择的候选人的详细信息。我被指示不要使用jquery或JS,这意味着我不能使用$或document.getelementbyId。我仍然是一个学习者,所以我需要帮助才能用纯打字稿编写 thi 代码。无论如何,这里是细节: -
我创建了一个带有子句的虚拟模板列表,每个子句都有一个与之关联的文本
templateList = [{
templateId: 1,
templateName: "Offer",
clauses: [
{
clauseName: "Introduction",
clauseId: 1,
texts: [
{
text: "Hello <<Name>>, Welcome to the Machine",
textId: 1,
}]
},
{
clauseName: "Address",
clauseId: 2,
texts: [
{
text: "<<Address>>",
textId: 2,
}]
},
{
clauseName: "Date Of Joining",
clauseId: 3,
texts: [
{
text: "You can join us on <<DateOfJoining>>",
textId: 3,
}]
},
]
}]
还有候选人名单
candidateList = [
{ name: "Simba", address: "Some Random Cave" },
{ name: "Doe John", address: "line 4, binary avenue, Mobo" },
{ name: "B Rabbit", address: "8 mile road, Detroit" },
{ name: "Peter Griffin", address: "Spooner Street" },
{ name: "Speedy Gonzales", address: "401, hole 34, Slyvester Cat Road" },
{ name: "Morty", address: "Time Machine XYZ" },
{ name: "Brock", address: "pokeball 420, Medic center" },
]
我的任务是将模板列表(包括<<>>)文本中夹在<<>>之间的字符串替换为我从候选人列表中单击的候选人的姓名或地址。
这是 HTML:
<div style="display: block;">
<button (click)="showTeplate()">Show template</button>
</div>
<hr /><br />
<div class="row">
<div class="col-4">
<ul>
<ol *ngFor="let x of candidateList">
<a>{{x.name}}</a><br />
<a><small>{{x.address}}</small></a>
<hr />
</ol>
</ul>
</div>
<div class="col-8">
<div class="templateDiv">
<div *ngFor="let temp of clauseList">
<span><strong class="textTemp">{{temp.clauseName}}</strong></span>
<br/>
<div *ngFor = "let x of temp.texts">
<p class="txt">{{x.text}}</p>
</div>
</div>
</div>
</div>
</div>
我还想知道是否有人可以告诉我这是否可以作为动态数据点的示例。这是一个https://stackblitz.com/edit/angular-ntu3lm
请帮我解决一下这个。
解决方案
应用组件.ts
candidateList = [
{ name: "Simba", address: "Some Random Cave", dateOfJoin: "5/4/2019" },
{ name: "Doe John", address: "line 4, binary avenue, Mobo" },
{ name: "B Rabbit", address: "8 mile road, Detroit" },
{ name: "Peter Griffin", address: "Spooner Street" },
{ name: "Speedy Gonzales", address: "401, hole 34, Slyvester Cat Road" },
{ name: "Morty", address: "Time Machine XYZ" },
{ name: "Brock", address: "pokeball 420, Medic center" }
];
clauseList: Object[] = [];
showTeplate(name: string, address: string, dateOfJoin: string) {
this.clauseList = [];
for (let template of this.templateList) {
if (template.clauses != null) {
for (let clause of template.clauses) {
this.setClauseText(clause, address, name, dateOfJoin);
this.clauseList.push(clause);
}
}
}
console.log("Clause list", this.clauseList);
}
setClauseText(clause: any, address, name, dateOfJoin) {
let text = clause.texts[0].text;
if (clause.clauseName === "Introduction") {
const nameToReplace = this.getTextName(text);
if (name !== undefined) {
clause.texts[0].text = text.replace(nameToReplace, name.concat(","));
} else clause.texts[0].text = text.replace(nameToReplace, "N/A");
} else if (clause.clauseName === "Address") {
if (address !== undefined)
clause.texts[0].text = text.replace(text, address);
else clause.texts[0].text = text.replace(text, "N/A");
} else if (clause.clauseName === "Date Of Joining") {
const dateOfJoinToReplace = this.getTextDateOfJoin(text);
if (dateOfJoin !== undefined)
clause.texts[0].text = text.replace(dateOfJoinToReplace, dateOfJoin);
else clause.texts[0].text = text.replace(dateOfJoinToReplace, "N/A");
}
console.log("ClasueText ==", clause.texts[0].text);
}
getTextName(text: string) {
const splitArray = text.split(" ");
if (splitArray[2].includes(","))
return splitArray[1] + " " + splitArray[2];
else return splitArray[1];
}
getTextDateOfJoin(text: string) {
const splitArray = text.split(" ");
return splitArray[5];
}
应用组件.html
<hr /><br />
<div class="row">
<div class="col-4">
<ul>
<ol *ngFor="let x of candidateList">
<a (click)="showTeplate(x.name,x.address,x.dateOfJoin)">{{x.name}}</a><br />
<a (click)="showTeplate(x.name,x.address,x.dateOfJoin)"><small>{{x.address}}</small></a>
<hr />
</ol>
</ul>
</div>
<div class="col-8">
<div class="templateDiv">
<div *ngFor="let temp of clauseList">
<span><strong class="textTemp">{{temp.clauseName}}</strong></span>
<br/>
<div *ngFor = "let x of temp.texts">
<p class="txt">{{x.text}}</p>
</div>
</div>
</div>
</div>
</div>
我已经修改了您的代码,特别是 showTemplate 函数。
推荐阅读
- php - 从 url codeigniter 中删除 index.php
- java - 在我的项目中使用 JAVA 实施 Elasticsearch 的最佳方法是什么?
- jquery - jQ ToggleClass 和执行正确元素的麻烦
- c# - 如何保存/加载到具有不可序列化属性的磁盘类?
- sql - 如何使用 IF EXISTS 修复 SQL 不正确的语法
- angular - Angular 5.2.0:优化大列表渲染
- android - 将数据从存储库传递到 ViewModel
- javascript - 颜色标记定期更换
- node.js - Node.js Mongoose 中的点赞数
- excel - Excel - 聚合:从非空白单元格中提取数据