Angular CDK DnD와 함께 맵을 사용할 때 뷰를 업데이트하는 방법은 무엇입니까?

궤양

재정렬할 수 있는 몇 가지 항목이 있는 작은 목록이 있습니다( stackblitz 참조 ). 내부적으로 해당 목록은 지도로 구현됩니다. 편리하게도 Angular는 파이프 키값을 제공하므로 다음과 같이 맵을 쉽게 반복할 수 있습니다.

*ngFor="let item of doc.items | keyvalue:sortHash"

목록 정렬을 처리할 함수 sortHash를 제공할 수 있습니다. cdkDropList목록에 DnD 순서를 제공하기 위해 사용하고 싶습니다 . 배열을 사용할 때 이것은 간단합니다.

(cdkDropListDropped)="dropItem($event, doc.items, doc)

cdkDropListDropped배열 내에서 항목 이동을 처리 하는 함수를 전달하기 만 하면 됩니다. Angular는 다음과 같은 내장 함수 moveItemInArray를 제공합니다.

import { moveItemInArray } from '@angular/cdk/drag-drop';
...
async dropItem(event: CdkDragDrop<string[]>, list: any, doc: any) {
  moveItemInArray(list, event.previousIndex, event.currentIndex);
}

이것은 배열에서 예상대로 작동하지만 제 경우에는 "order" 속성으로 순서가 정의된 맵에 의존합니다. 내 데이터 구조를 참조하십시오.

  doc = {
    meta: {
      text: 'title',
      ...
    },
    items: {
      SEC_000000: {
        meta: {
          text: 'Episode I - The Phantom Menace',
          order: '0',
          ...
        },
      },
      SEC_111111: {
        meta: {
          text: 'Episode II - Attack of the Clones',
          order: '1',
          ...
        },
      },
      SEC_222222: {
        meta: {
          text: 'Episode III - Revenge of the Sith',
          order: '2',
          ...
        },
      },
    },
  };

따라서 내 dropItem기능은 약간 다릅니다.

  1. 내 지도( doc.items)를 배열로 변환합니다.
  2. 그런 다음 내장 moveItemInArray함수를 사용하여 배열 내부의 항목을 효과적으로 이동합니다.
  3. 그런 다음 모든 항목의 "주문" 속성을 업데이트하고 마지막으로
  4. 배열을 다시 맵으로 변환

정렬 기능은 예상대로 작동하지만 DnD 시 UI가 업데이트되지 않습니다.

다음은 단순화된 샘플 코드 가 있는 stackblitz 입니다. 내가 여기서 무엇을 놓치고 있습니까?

마퀴즈

답은 Angular 코어 깊숙이 있습니다. 를 사용하고 KeyValuePipe있습니다. 출처 여기 .

우리가 관심을 갖는 파이프 부분은 다음과 같습니다.

    const differChanges: KeyValueChanges<K, V>|null = this.differ.diff(input as any);
    const compareFnChanged = compareFn !== this.compareFn;

    if (differChanges || compareFnChanged) {
      this.keyValues.sort(compareFn);
      this.compareFn = compareFn;
    }

차이가 입력 개체에서 차이를 찾으면 정렬 기능이 실행됩니다.

로그를 콘솔 에 표시 하고 보기가 초기화된 후 differChanges일관되게 반환되는 것을 확인할 수 있습니다. null왜요? 다른 코드 를 살펴봐야 합니다 .

  // Add the record or a given key to the list of changes only when the value has actually changed
  private _maybeAddToChanges(record: KeyValueChangeRecord_<K, V>, newValue: any): void {
    if (!Object.is(newValue, record.currentValue)) {
      record.previousValue = record.currentValue;
      record.currentValue = newValue;
      this._addToChanges(record);
    }
  }

차이점은 Object.is(newValue, record.currentValue)값이 변경되었는지 확인하는 데 사용됩니다. 이 경우 diff할 객체의 값은 객체 자체이며 Object.is()깊은 동등성을 평가하지 않습니다.

따라서 최소한 두 가지 옵션이 있습니다.

  • 원하는 방식으로 작동하는 고유한 키 값 파이프를 작성하십시오.
  • 다른 데이터 구조를 사용하여 영화 정보 보관

사용자 지정 무차별 대입 전략 keyvalue파이프 를 사용 하여 작동하는 StackBlitz를 만들었습니다 .

이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.

침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제

에서 수정
0

몇 마디 만하겠습니다

0리뷰
로그인참여 후 검토

관련 기사

이전 / 이후와 함께 scalatest를 사용할 때 'null'을 피하는 방법은 무엇입니까?

R-FOR LOOP와 함께 ASSIGN을 사용할 때 NA를 제거하는 방법은 무엇입니까?

grunt와 함께 dalekjs를 사용할 때보고 옵션을 구성하는 방법은 무엇입니까?

ffmpeg와 함께 sox를 사용할 때 샘플 형식을 설정하는 방법은 무엇입니까?

flexbox와 함께 vh를 사용할 때 Component-Streching을 수정하는 방법은 무엇입니까?

Angular ui-router와 함께 AngularFire를 사용할 때 경로 보안을 활성화하는 방법은 무엇입니까?

중첩 된 뷰와 함께 ui-router를 사용할 때 사용자 컨트롤러를 추가하는 방법은 무엇입니까?

미리 정의 된 슬롯과 함께 Angular CDK DragDrop을 사용하는 방법은 무엇입니까?

텍스트와 함께 glyphicon을 사용할 때 추가 공간을 피하는 방법은 무엇입니까?

[routerLink] (Angular)를 사용하여 구성 요소와 함께 Storybook을 사용하는 방법은 무엇입니까?

NavigationLink와 함께 사용할 때 NavigationView에서 보기를 재사용하는 방법은 무엇입니까?

Typescript와 함께 Vue.js를 사용할 때 vue-resource와 같은 플러그인을 사용하는 방법은 무엇입니까?

Vim이 Ctrl + v와 함께 사용할 때 Ctrl을 먹어 치우는 이유와이를 해결하는 방법은 무엇입니까?

Angular + templateCache와 함께 Webpack을 사용하는 방법은 무엇입니까?

Angular2와 함께 Luxon을 사용하는 방법은 무엇입니까?

Mathjax를 Angular2와 함께 사용하는 방법은 무엇입니까?

Angular와 함께 jQuery를 사용하는 방법은 무엇입니까?

Angular와 함께 nebular를 사용하는 방법은 무엇입니까?

Angular-CLI와 함께 AMD를 사용하는 방법은 무엇입니까?

SystemJS 및 Angular와 함께 Typescript를 사용하는 방법은 무엇입니까?

SwiftUI와 함께 ZStack을 사용하여 하위 뷰를 자르는 방법은 무엇입니까?

dplyr에서 mutate와 함께 minimum을 사용할 때 중복을 처리하는 방법은 무엇입니까?

FirestoreRecyclerAdapter와 함께 RecyclerView를 사용할 때 스크롤 위치를 설정하는 방법은 무엇입니까?

LiveData와 함께 PagedListAdapter를 사용할 때 빈보기를 표시하는 방법은 무엇입니까?

패키지와 함께 JNI를 사용할 때 UnsatisfiedLinkError를 해결하는 방법은 무엇입니까?

OkHttp와 함께 Volley를 사용할 때 Http 캐시를 구성하는 방법은 무엇입니까?

템플릿 리터럴 유형과 함께 매핑된 유형을 사용할 때 원본 맵 키를 사용하는 방법은 무엇입니까?

SwiftUI와 함께 SceneKit을 사용할 때 SCNSceneRendererDelegate 메서드에 액세스하는 방법은 무엇입니까?

Generics와 함께 사용할 때 "Bad operand for binary operator '+'"를 해결하는 방법은 무엇입니까?

TOP 리스트

  1. 1

    Ionic 2 로더가 적시에 표시되지 않음

  2. 2

    JSoup javax.net.ssl.SSLHandshakeException : <url>과 일치하는 주체 대체 DNS 이름이 없습니다.

  3. 3

    std :: regex의 일관성없는 동작

  4. 4

    Xcode10 유효성 검사 : 이미지에 투명성이 없지만 여전히 수락되지 않습니까?

  5. 5

    java.lang.UnsatisfiedLinkError : 지정된 모듈을 찾을 수 없습니다

  6. 6

    rclone으로 원격 디렉토리의 모든 파일을 삭제하는 방법은 무엇입니까?

  7. 7

    상황에 맞는 메뉴 색상

  8. 8

    SMTPException : 전송 연결에서 데이터를 읽을 수 없음 : net_io_connectionclosed

  9. 9

    정점 셰이더에서 카메라에서 개체까지의 XY 거리

  10. 10

    Windows cmd를 통해 Anaconda 환경에서 Python 스크립트 실행

  11. 11

    다음 컨트롤이 추가되었지만 사용할 수 없습니다.

  12. 12

    C #에서 'System.DBNull'형식의 개체를 'System.String'형식으로 캐스팅 할 수 없습니다.

  13. 13

    JNDI를 사용하여 Spring Boot에서 다중 데이터 소스 구성

  14. 14

    Cassandra에서 버전이 지정된 계층의 효율적인 모델링

  15. 15

    복사 / 붙여 넣기 비활성화

  16. 16

    Android Kotlin은 다른 활동에서 함수를 호출합니다.

  17. 17

    Google Play Console에서 '예기치 않은 오류가 발생했습니다. 나중에 다시 시도해주세요. (7100000)'오류를 수정하는 방법은 무엇입니까?

  18. 18

    SQL Server-현명한 데이터 문제 받기

  19. 19

    Seaborn에서 축 제목 숨기기

  20. 20

    ArrayBufferLike의 typescript 정의의 깊은 의미

  21. 21

    Kubernetes Horizontal Pod Autoscaler (HPA) 테스트

뜨겁다태그

보관