【问题标题】:drag and drop angular order not changing拖放角度顺序不变
【发布时间】:2020-04-13 05:21:57
【问题描述】:

我基于这个https://stackblitz.com/edit/angular-dynamic-survey-creation-golkhg创建表单生成器,我使用这个函数来删除

onDrop(event: CdkDragDrop<string[]>) {
    moveItemInArray(this.surveyForm.get('surveyQuestions')['controls'], event.previousIndex, event.currentIndex);
}

questionTitle 必须改变,但不是

但在 html 中它正在改变

数组的顺序在html中发生了变化,但在我的json中没有变化,有人可以帮助我吗?

编辑

一段时间后我不再碰这段代码,我发现了一些错误,请看之前和之后的图像,这里是之前的

"quizQuestions": [
    {
      "questionType": "File Upload",
      "display_order": 1,
      "questionGroup": {
        "questionTitle": "",
        "quizAnswer": ""
      }
    },
    {
      "questionType": "Tanggal",
      "display_order": 2,
      "questionGroup": {
        "questionTitle": "",
        "quizAnswer": ""
      }
    }
  ],

我拖动第一个表单后,它看起来像这样

"quizQuestions": [
    {
      "questionType": "Tanggal",
      "display_order": 2,
      "questionGroup": {
        "questionTitle": "",
        "quizAnswer": ""
      }
    },
    {
      "questionType": "File Upload",
      "display_order": 1,
      "questionGroup": {
        "questionTitle": "",
        "quizAnswer": ""
      }
    }
  ],

究竟出了什么问题?我已经尝试了你们提供的两种最佳解决方案,但仍然是这样,请帮助我。注意:我将 surverysQuestions 更改为 quizQuestions

【问题讨论】:

    标签: angular angular-material angular-cdk angular-cdk-drag-drop


    【解决方案1】:

    您需要在 formGroup 中添加 display_order 属性,您可以在该属性中看到顺序更改。

    并在 onDrop 方法中更改其他问题的显示顺序。像这样:

    onDrop(event: CdkDragDrop<string[]>) {
       moveItemInArray(this.surveyForm.get('surveyQuestions')['controls'], event.previousIndex, event.currentIndex);
       this.questionFormArray.controls[event.currentIndex]['controls']['display_priority']
                .setValue(event.currentIndex + 1);
       this.questionFormArray.controls.forEach((category, index) => {
                (category as FormGroup).controls['display_priority'].setValue(index + 1);
       });
    }
    

    【讨论】:

      【解决方案2】:

      尝试将 changeDetectionStrategy 添加到您的组件中

      https://angular.io/api/core/ChangeDetectionStrategy

      【解决方案3】:

      方法示例:

      onDrop(event: CdkDragDrop<string[]>) {
         moveItemInArray(this.surveyForm.get('surveyQuestions')['controls'], event.previousIndex, event.currentIndex);
        this.surveyForm.get('surveyQuestions').updateValueAndValidity({ onlySelf: false });
      }
      

      【讨论】:

      • 如果您留下任何 cmet 来回答问题,效果会更好
      • gourav 解决方案有什么不同?
      • updateValueAndValidity 允许您修改一个或多个表单控件的值,并且该标志允许您指定是否希望将值发送给 valueChanges 订阅者。 moveItemInArray 方法后需要使用 updateValueAndValidity 方法,无需手动操作。
      • 嘿,我只是试试你的解决方案,但是你和其他人的解决方案看起来有点奇怪,但在 json 中它是完美的,请看我的编辑真的需要你的帮助
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-06-29
      相关资源
      最近更新 更多