Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/angular/31.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 如何将窗体值修补为递归嵌套的角度窗体?_Javascript_Angular - Fatal编程技术网

Javascript 如何将窗体值修补为递归嵌套的角度窗体?

Javascript 如何将窗体值修补为递归嵌套的角度窗体?,javascript,angular,Javascript,Angular,最近,我问了以下关于StackOverflow的问题,得到了一个令人惊讶的回答,结果是构建了一个递归嵌套的角度表单:。作者写的关于同一个问题的文章 这个递归嵌套的角度形式允许我继续构建组formarray,所有这些组都有一个group对象: { "conjunctor": null, "conditions": [ { "variable": } "groups&q

最近,我问了以下关于StackOverflow的问题,得到了一个令人惊讶的回答,结果是构建了一个递归嵌套的角度表单:。作者写的关于同一个问题的文章

这个递归嵌套的角度形式允许我继续构建组
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(称为