Angular 中使用反应形式的字段的动态?
Dynamic from fields using reactive forms in Angular?
我有一个场景需要编辑单引号值(仅单引号值),
所以我使用正则表达式提取了单引号值并准备了反应式动态表单。
点击执行编辑按钮会在上面显示旧的步骤名称,在下面显示新的步骤名称,提交步骤将替换原来数组中的步骤名称。
根据我的方法,在少数情况下工作正常,但在某些情况下,我意识到我遵循的任何算法都不能满足我的要求。
下面是测试用例
测试案例1:
步骤名称:“那么我应该为 'USA' 雇用一名使用资料‘1’的员工”,
// 这里 --> '1', 'USA' 值是可编辑的
测试用例 2:“员工应在 'Current' 财政年度‘01’的‘01’天受雇”
// '01', '01', 'Current'
问题:在测试用例 2 中,如果我尝试编辑第二个 01,它正在编辑第一个 01
我尝试借助 indexof、子字符串函数来解决执行编辑功能
this.replaceString = this.selectedStep.name;
this.metaArray.forEach((element: any) => {
var metaIndex = this.replaceString.indexOf(element.paramValue);
if (metaIndex !== -1) {
const replaceValue = this.stepEditForm.controls[element['paramIndex']].value;
this.replaceString = this.replaceString.substring(0, metaIndex) + replaceValue + this.replaceString.substring(metaIndex + (element.paramValue.length));
}
});
但在 indexof 中总是找到字符串中第一次出现的值。所以我意识到我的方法在执行函数时是错误的
代码见附件
https://stackblitz.com/edit/angular-reactive-forms-cqb9hy?file=app%2Fapp.component.ts
那么谁能向我建议如何解决这个问题,
提前致谢
我添加了一个名为 matchStartingPositions 的函数,returns 每个匹配的起始位置索引。使用此方法,您可以像您一样通过替换字符串来执行编辑,但我们会在给定位置找到要替换的正确匹配项。
所以在你的行中
var metaIndex = this.replaceString.indexOf(element.paramValue);
然后我们可以给indexOf加上第二个参数,也就是起点:
var metaIndex = this.replaceString.indexOf(element.paramValue, startingPositions[element.paramIndex]);
获取索引位置的函数只查找给定字符串中的那些单引号:
matchStartingPositions(str) {
let count = 0;
let indices = [];
[...str].forEach((val, i) => {
if (val === "'") {
if (count % 2 == 0) {
indices.push(i);
}
count++;
}
});
return indices;
}
这是实际操作:
https://angular-reactive-forms-xhkhmx.stackblitz.io
https://stackblitz.com/edit/angular-reactive-forms-xhkhmx?file=app/app.component.ts
我有一个场景需要编辑单引号值(仅单引号值),
所以我使用正则表达式提取了单引号值并准备了反应式动态表单。
点击执行编辑按钮会在上面显示旧的步骤名称,在下面显示新的步骤名称,提交步骤将替换原来数组中的步骤名称。
根据我的方法,在少数情况下工作正常,但在某些情况下,我意识到我遵循的任何算法都不能满足我的要求。
下面是测试用例
测试案例1: 步骤名称:“那么我应该为 'USA' 雇用一名使用资料‘1’的员工”, // 这里 --> '1', 'USA' 值是可编辑的
测试用例 2:“员工应在 'Current' 财政年度‘01’的‘01’天受雇” // '01', '01', 'Current'
问题:在测试用例 2 中,如果我尝试编辑第二个 01,它正在编辑第一个 01
我尝试借助 indexof、子字符串函数来解决执行编辑功能
this.replaceString = this.selectedStep.name;
this.metaArray.forEach((element: any) => {
var metaIndex = this.replaceString.indexOf(element.paramValue);
if (metaIndex !== -1) {
const replaceValue = this.stepEditForm.controls[element['paramIndex']].value;
this.replaceString = this.replaceString.substring(0, metaIndex) + replaceValue + this.replaceString.substring(metaIndex + (element.paramValue.length));
}
});
但在 indexof 中总是找到字符串中第一次出现的值。所以我意识到我的方法在执行函数时是错误的
代码见附件
https://stackblitz.com/edit/angular-reactive-forms-cqb9hy?file=app%2Fapp.component.ts
那么谁能向我建议如何解决这个问题,
提前致谢
我添加了一个名为 matchStartingPositions 的函数,returns 每个匹配的起始位置索引。使用此方法,您可以像您一样通过替换字符串来执行编辑,但我们会在给定位置找到要替换的正确匹配项。
所以在你的行中
var metaIndex = this.replaceString.indexOf(element.paramValue);
然后我们可以给indexOf加上第二个参数,也就是起点:
var metaIndex = this.replaceString.indexOf(element.paramValue, startingPositions[element.paramIndex]);
获取索引位置的函数只查找给定字符串中的那些单引号:
matchStartingPositions(str) {
let count = 0;
let indices = [];
[...str].forEach((val, i) => {
if (val === "'") {
if (count % 2 == 0) {
indices.push(i);
}
count++;
}
});
return indices;
}
这是实际操作:
https://angular-reactive-forms-xhkhmx.stackblitz.io
https://stackblitz.com/edit/angular-reactive-forms-xhkhmx?file=app/app.component.ts