【问题标题】:Angular CDK drag drop with (reactive) forms带有(反应式)表单的 Angular CDK 拖放
【发布时间】:2018-11-08 15:12:22
【问题描述】:

我有这个例子:https://stackblitz.com/edit/angular-asevei?file=app%2Fcdk-drag-drop-sorting-example.html

一切正常,但同时 拖动选择框“重置”为列表中的第一个值。

有没有办法解决这个问题?它只是视觉上的,但对用户来说非常刺耳。我曾尝试使用cdkDragPreview 选项,但无法使用。

组件:

import { Component } from '@angular/core';
import { CdkDragDrop, moveItemInArray } from '@angular/cdk/drag-drop';
import { FormBuilder, FormGroup, FormArray } from '@angular/forms';

@Component({
    selector: 'cdk-drag-drop-sorting-example',
    templateUrl: 'cdk-drag-drop-sorting-example.html',
    styleUrls: ['cdk-drag-drop-sorting-example.css'],
})
export class CdkDragDropSortingExample {

    myForm: FormGroup;

    constructor(private fb: FormBuilder) {
    this.myForm = this.fb.group({
        title: ['title'],
        items: fb.array([
        fb.group({
            name: fb.control('1'),
            note: fb.control('quux')
        }),
        fb.group({
            name: fb.control('2'),
            note: fb.control('bar')
        }),
        fb.group({
            name: fb.control('3'),
            note: fb.control('baz')
        })

        ])
    })
    }

    drop(event: CdkDragDrop<string[]>) {
    moveItemInArray(this.myForm.get('items').controls, event.previousIndex, event.currentIndex);
    moveItemInArray(this.myForm.get('items').value, event.previousIndex, event.currentIndex);
    }
}

模板:

<form [formGroup]="myForm">
    <input formControlName="title" />
    <div cdkDropList id="foo" class="example-list" (cdkDropListDropped)="drop($event)">
        <div class="example-box" *ngFor="let item of myForm.get('items').controls" cdkDrag>
            <span cdkDragHandle>drag</span>
            <div [formGroup]="item">
                <input type="text" formControlName="name">
                <select formControlName="note">
                    <option>foo</option>
                    <option>bar</option>
                    <option>baz</option>
                    <option>quux</option>
                </select>
            </div>
        </div>
    </div>
    {{ myForm.value | json }}
</form>

【问题讨论】:

  • 您的拖放表单项目是如何发展的。我正在做一个类似的项目。你想聊天吗?

标签: angular angular-reactive-forms angular-cdk


【解决方案1】:

我已经修改了@Amir Fawzy 的答案,添加了一个变量来获取当前活动的笔记,该笔记在拖动选定的框时显示。

TS:

activeNote: string;
enter(i) {
  this.activeNote = this.myForm.get('items')['controls'][i].get('note').value;
}

HTML:

<div cdkDropList class="example-list" (cdkDropListDropped)="drop($event)">
  <div [id]="i" class="example-box" *ngFor="let item of myForm.get('items').controls; let i=index;" cdkDrag #elem="cdkDrag" (mouseenter)="enter(i)">
    <span cdkDragHandle>drag</span>
    <div [formGroup]="item">
      <input type="text" formControlName="name">
      <select formControlName="note">
        <option [hidden]="elem.moved">{{activeNote}}</option>
        <option>foo</option>
        <option>bar</option>
        <option>baz</option>
        <option>quux</option>
      </select>
    </div>
  </div>
</div>

Here's a duplicate on Stackblitz..

【讨论】:

  • 你和@Amir Fawzy 的回答让我找到了一个稍微不同的解决方案:stackblitz.com/edit/angular-asevei-wwblpi?file=app/… 使用带有 *cdkDragPreview 指令和 (cdkDragStarted) 事件的 activeNote 选项。谢谢!
  • *cdkDragPreview 是另一个不错的选择。我们只关注选择框的显示。无论如何,很高兴我能提供帮助:)
  • @tech-no-logical 我相信您可以将其报告为 github 存储库中的错误:github.com/angular/material2/issues 我根本不希望选择会以这种方式做出反应。我自己调查它,但运气不好,为什么会发生这种情况。不过,预览是一个不错的解决方法。
【解决方案2】:

您的代码没有问题,但如果这样称呼它,这个问题是由drag-drop cdk 引起的,因为这是我所知道的默认行为,但您可以解决该问题以增强该行为以使其对用户看起来不错。

试试这个

<div class="example-box" *ngFor="let item of myForm.get('items').controls" cdkDrag #elem="cdkDrag">
  <span cdkDragHandle>drag</span>
  <div [formGroup]="item">
    <input type="text" formControlName="name">
    <select formControlName="note">
      <option [hidden]="elem.moved">dragging...</option>
      <option>foo</option>
      <option>bar</option>
      <option>baz</option>
      <option>quux</option>
     </select>
  </div>
</div>

这里发生了什么事情#elem="cdkDrag"添加到拖动元素为local reference
&lt;option [hidden]="elem.moved"&gt;dragging...&lt;/option&gt;这里会发生的是当用户拖动元素时dragging select option将在用户结束时显示在select input中拖动它会再次隐藏,选择输入值会再次设置一些 css 看起来不错。

【讨论】:

    【解决方案3】:

    Angular Material 中的mat-select 似乎工作正常,请参阅https://ngfelixl.github.io/ng-libraries

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-09-29
      • 2019-04-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多