Javascript 如何将窗体值修补为递归嵌套的角度窗体?
最近,我问了以下关于StackOverflow的问题,得到了一个令人惊讶的回答,结果是构建了一个递归嵌套的角度表单:。作者写的关于同一个问题的文章 这个递归嵌套的角度形式允许我继续构建组Javascript 如何将窗体值修补为递归嵌套的角度窗体?,javascript,angular,Javascript,Angular,最近,我问了以下关于StackOverflow的问题,得到了一个令人惊讶的回答,结果是构建了一个递归嵌套的角度表单:。作者写的关于同一个问题的文章 这个递归嵌套的角度形式允许我继续构建组formarray,所有这些组都有一个group对象: { "conjunctor": null, "conditions": [ { "variable": } "groups&q
formarray
,所有这些组都有一个group
对象:
{
"conjunctor": null,
"conditions": [
{
"variable":
}
"groups": []
}
您可以添加多个条件的实例
,并进一步嵌套组
,如中所示
基本上,表单组件已拆分为多个组件:
组控制
,条件表单
,以及动作按钮栏
(发出动作的按钮)。这种方法做了我需要的一切,但是,我在通过这种递归方法修补表单值时遇到了麻烦
到目前为止,我已经尝试发送一个静态语句对象,并将其修补到整个表单本身,以及专门针对组
对象。下面是这张照片中的照片
应用组件:
(我在组控制
组中也尝试了相同和类似的方法)。最终,我计划使用API中的数据来填充和修补这些值,但现在和测试中,使用这些静态数据
ngOnInit() {
const data = {
statement: {
groups: [
{
conjunctor: "and",
conditions: [
{
variable: "asdf"
}
],
groups: []
}
]
}
};
this._form.patchValue(data);
console.log(this._form.value);
}
是否可以在递归表单上修补语句FormGroup
的表单值?
你的数据没有问题。这可能是个时间问题。表单必须稳定,才能修补任何值。当您在OnInit
中执行此操作时,我假设您正在构造函数中构建表单。如果是这样,表单还没有准备好接收任何值
解决这个问题的最简单方法是使用一个不舒服的setTimeout
。但我想这只是为了测试。在实际情况下,无论如何,这些数据都可能有一段时间可用
如果使用前面提到的setTimeout
将上面的示例包装起来,则可以使用:
ngOnInit(){
设置超时(()=>{
常数数据={
声明:{
小组:[
{
魔术师:“和”,
条件:[
{
变量:“asdf”
}
],
组:[]
}
]
}
};
此._形式的补丁值(数据);
console.log(此形式值);
}, 50);
}
下面的动画gif显示了3个嵌套组中的补丁,最后一个嵌套在第二个组中
根据给定数据构建表单
您可以做的一件有趣的事情是根据您拥有的数据自动构建表单。您可以通过分析进入ControlValueAccessor.writeValue
的数据来实现这一点:
if(!value){
返回;
}
设置超时(()=>{
if(value&&value.conditions&&value.conditions.length){
这是。_conditionsFormArray.clear();
value.conditions.forEach(c=>this._addCondition());
}
if(value&&value.groups&&value.groups.length){
此._groupsFormArray.clear();
value.groups.forEach(g=>this._addGroup());
}
此._形式.patchValue(值);
}, 50);
也许您已经注意到上面的setTimeout
,它的存在是因为我们在表单创建方法中有另一个setTimeout(调用OnInit
),它在表单创建后向表单添加一个条件,而条件的创建本身就在setTimeout
中。因此,我们必须等待它运行,否则this.\u conditionsFormArray.clear()代码>不会有任何影响=>当它运行时不会创建任何条件
private\u createFormGroup(){
这个。_形式=这个。_fb.group({
从犯:无效,
条件:this.\u fb.array([]),
组:this.\u fb.array([])
});
//在表单创建后的下一个勾号上添加一个条件
setTimeout(()=>this._addCondition());
}
然后,通过一些调整,我们可以得到以下结果(下面的gif是基于另一个):
你的数据没有问题。这可能是个时间问题。表单必须稳定,才能修补任何值。当您在OnInit
中执行此操作时,我假设您正在构造函数中构建表单。如果是这样,表单还没有准备好接收任何值
解决这个问题的最简单方法是使用一个不舒服的setTimeout
。但我想这只是为了测试。在实际情况下,无论如何,这些数据都可能有一段时间可用
如果使用前面提到的setTimeout
将上面的示例包装起来,则可以使用:
ngOnInit(){
设置超时(()=>{
常数数据={
声明:{
小组:[
{
魔术师:“和”,
条件:[
{
变量:“asdf”
}
],
组:[]
}
]
}
};
此._形式的补丁值(数据);
console.log(此形式值);
}, 50);
}
下面的动画gif显示了3个嵌套组中的补丁,最后一个嵌套在第二个组中
根据给定数据构建表单
您可以做的一件有趣的事情是根据您拥有的数据自动构建表单。您可以通过分析进入ControlValueAccessor.writeValue
的数据来实现这一点:
if(!value){
返回;
}
设置超时(()=>{
if(value&&value.conditions&&value.conditions.length){
这是。_conditionsFormArray.clear();
value.conditions.forEach(c=>this._addCondition());
}
if(value&&value.groups&&value.groups.length){
此._groupsFormArray.clear();
value.groups.forEach(g=>this._addGroup());
}
此._形式.patchValue(值);
}, 50);
也许您已经注意到上面的setTimeout
,它的存在是因为我们在表单创建方法中有另一个setTimeout(称为