2

我想在 Angular 5中使用FormArray 。

我已经创建了一个表单列表,FormArray我想用ngx-dnd重新组织它们。

这是我的代码:

<div class="ngx-dnd-container" ngxDroppable [model]="formData.controls">
     <div class="ngx-dnd-item" ngxDraggable [model]="line" formArrayName="lines" *ngFor="let line of formData.controls; let i = index;">
         <div [formGroupName]="i"> 
            <textarea formControlName="linedescription"></textarea>
        </div>
    </div>
</div>

如果用户在拖放后键入 textarea,则此代码可以正常工作。

如果用户只是拖放,则此代码不起作用,在这种情况下,我的表单数组“行”与拖放更改顺序之前相同。

我应该如何将 ng-dnd 与 FormArray 一起使用,我是否可以在我的组件中使用 ng-dnd 的回调方法在“drop”之后执行某些操作?

4

1 回答 1

3

好的,我有解决方案!

1 - ngx-dnd 事件

ngx-dnd 库允许我们使用许多事件:drop(), drag(), over(), out(), remove(), cancel(). (来源

因此,如果项目被“丢弃”,您可以在组件中调用自己的方法。例如:

form.component.html

<div (drop)="dropped($event)" 
     class="ngx-dnd-container" 
     ngxDroppable 
     [model]="formData.controls">
//...

form.component.ts

dropped(event) {
    alert('Ok drop is Done !')
}

2 - 更新 FormArray

问题就在这里:我们的“删除操作”没有重新排序 FormArray。

Angular 的FormArray 类公开了许多方法来解决这个问题。我选择该reset()方法是因为我们可以将值作为参数传递并更新整个 FormArray。

reset(value?: any, options?: Object)

最后,在您的 form.component.ts 中更新您的方法

dropped(event) {
    let linesCopy = [];
    this.lines = this.form.get('lines') as FormArray;
    for(let line of this.lines.controls) {
        linesCopy.push(line.value);
    }
    this.lines.reset(linesCopy);
}

它现在可以正常工作了,你可以在这个Stackblitz中看到一个完整的工作示例和源代码。

PS:在 Angular 中操作表单时,请注意仅使用表单类方法。不要使用 JavaScript 方法来推送、删除、设置值等。仅使用FormArray 类方法。

于 2018-02-13T21:25:57.890 回答