【问题标题】:formArray getting error in ng drag drop angularformArray 在 ng 拖放角度中出现错误
【发布时间】:2021-08-25 19:31:11
【问题描述】:

团队

我正在创建拖放操作,以便将字段从我的工具栏移动到面板

但我在表单中拖放时遇到错误这是我目前遇到的错误。

这是我的 ts 代码

  ngOnInit(): void {
this.fields = localStorage.getItem('fields') ? JSON.parse(localStorage.getItem('fields')) : {}
this.getFieldData();
this.getCountryData();
this.myForm = this.formBuilder.group({
  arr: this.formBuilder.array([this.createItem()])
})
this.personalDetails = this.formBuilder.group({
  title: ['', Validators.required],
  firstName: ['', Validators.required],
  lastName: ['', Validators.required],
  guardianName: ['', Validators.required],
  guardianContactNo: ['', Validators.required],
  dob: ['', Validators.required],
  universityName: [''],
  middleName: ['']
});
this.contactDetails = this.formBuilder.group({
  address1: ['', Validators.required],
  address2: ['', Validators.required],
  apt: ['', Validators.required],
  countryData: ['', Validators.required],
  stateData: ['', Validators.required],
  cityData: ['', Validators.required],
  postalCode: [''],
  phoneNumberH: [''],
  phoneNumberO: [''],
  phoneNumberOff: [''],
  mobileNumber: [''],
  email: ['']
});

}

  onAnyDrop(e: any, formGroupName: string) {
console.log(e, formGroupName);
if (formGroupName === 'personalDetails') {
  this.addInput(this.personalDetails, e.fieldType, 'ABCED', false);
} else if (formGroupName === 'contactDetails') {
  this.addInput(this.contactDetails, e.fieldType, 'XYZABC', false);
}

}

addInput(fg, type: string, label: string, required: boolean = false): void {
const arrayControl = <FormArray>this.myForm.controls['formArray'];
let newGroup
switch (type) {
  case 'Text': {
    fg.array([{
      [label]: ['', required ? Validators.required : null]
    }])
    break;
  }
  case 'Number': {
    fg.array({
      [label]: [0, required ? Validators.required : null]
    });
    break;
  }
  default: {
    fg.array({
      [label]: ['', required ? Validators.required : null]
    });
    break;
  }
}
arrayControl.push(newGroup);

}

这是我的 HTML

     <div class="fieldexplorer">
          <div class="sectionHeader_field">
                Field Explorer
          </div>
          <div draggable [dragData]="label" *ngFor="let label of labels;">
              <div class="hoverselect" style="padding: 8px;border: 1px solid black;">
                   <span [ngClass]="(label.fieldType=='Number'?'numberbefore':(label.fieldType=='List'?'listbefore':'radiobefore'))">
                   </span> {{label.labelName}}
              </div>
          </div>
       </div>

这是我的可放置区域

<div class="row" [droppable] [dragHintClass]="'drag-hint'" (onDrop)="onAnyDrop($event, 'personalDetails')">
</div>
<div class="row" [droppable] [dragHintClass]="'drag-hint'" (onDrop)="onAnyDrop($event, 'contactDetails')">
</div>

【问题讨论】:

  • 请提供onAnyDrop的代码。
  • @N.F.我添加了 onAnyDrop 代码也请检查
  • 你想在addInput做什么?您是否尝试将名为 label 的新 FormControl 添加到 this.personalDetailsthis.contactDetails 并将其添加到 this.myForm.arr
  • @N.F.你是对的

标签: angular typescript angular8 ngdraggable


【解决方案1】:

修改addInput如下。

addInput(fg, type: string, label: string, required: boolean = false): void {
  let newControl: FormControl;
  switch (type) {
    case 'Text': {
      newControl = new FormControl('');
      break;
    }
    case 'Number': {
      newControl = new FormControl(0);
      break;
    }
    default: {
      newControl = new FormControl('');
      break;
    }
  }
  if (required) {
    newControl.setValidators([Validators.required]);
  }
  fg.addControl(label, newControl);
  const arrayControl = this.myForm.get('arr') as FormArray;  
  arrayControl.push(fg);
}

【讨论】:

  • 感谢您的回答只是想了解您为什么删除了这部分 [label]: ['', required ? Validators.required : null]
  • 该部分对所有type 都是通用的。它们将在switch 之后完成。
  • 非常感谢您没有出现错误我这里还有一个查询我正在尝试拖放字段拖动工作正常但拖放没有按预期工作我正在使用 ng-drag -drop
  • 你可以在聊天中使用一段时间吗?我会在那里解释更多
  • 这是另一个问题。我建议你发布一个新问题。
猜你喜欢
  • 2019-07-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多