이 특정 상황에서 subscribe () 대신 async-pipe를 사용하는 것이 정말 낫습니까?

user2622344

내 구성 요소에서 @Input ()으로 Observable을 얻습니다.

Observable 값이 변경되면 ng-bootstrap 아코디언을 확장 / 축소해야합니다. 따라서 템플릿에 Observable 값이 실제로 필요하지 않습니다.

이것은 이미 코드입니다.

구성 요소:

@Input() urlParam$!: Observable<string>;

@ViewChild('acc') accordion!: NgbAccordion;

urlParamChange$!: Observable<string>;

ngAfterViewInit(): void {
  this.urlParamChange$ = this.urlParam$.pipe(
    tap(urlParam => this.synchronizeAccordion(urlParam))
  );
}

synchronizeAccordion(urlParam: string): void {
// do something with this.accordion
}

그리고 템플릿에서 비동기 파이프를 통해 새로 생성 된 urlParamChange $를 구독합니다.

<ng-container *ngIf="(urlParamChange$ | async)"></ng-container>

<ngb-accordion #acc="ngbAccordion">
 ....
</ngb-accordion>

urlParamChange $의 값이 실제로 필요하지 않기 때문에 자체 ng-container에 넣어 완전히 독립적이지만 그럼에도 불구하고 아코디언을 동기화하는 메서드가 호출됩니다.

위의 구현은 그다지 좋지 않다고 생각합니다. 작업을 두 개의 다른 파일로 분할합니다 (구성 요소의 탭이 필요하고 템플릿의 async-pipe가 추가로 필요함).

다음과 같은 방식으로 더 멋지지 않을까요? async-pipe의 도움으로 구독하는 대신 ngAfterViewInit ()에서 직접 subscribe ()합니다. 그런 식으로 추가 변수 urlParamChange $를 제거 할 수 있으며 구현은 모두 ngAfterViewInit () 메서드에 있습니다.

구성 요소:

@Input() urlParam$!: Observable<string>;

@ViewChild('acc') accordion!: NgbAccordion;

ngAfterViewInit(): void {
  this.urlParam$.subscribe(urlParam => this.synchronizeAccordion(urlParam));
}

synchronizeAccordion(urlParam: string): void {
// do something with this.accordion
}

그리고 템플릿에서 추가 ng-container가 제거됩니다.

<ngb-accordion #acc="ngbAccordion">
 ....
</ngb-accordion>

제 생각에는 두 구현 모두 똑같은 방식으로 작동해야합니다. Best Practises에 따르면 첫 번째 솔루션이 선호되어야한다고 생각합니다. 그러나 두 번째는 더 깨끗한 IMO입니다.

그렇다면 그러한 사용 사례를 구현하는 가장 좋은 방법은 무엇입니까?

나는 접근 방식 2를 사용하는 것이 좋습니다. 자신의 입학을 통해 더 깨끗하고 따라 가기 쉽습니다.

누군가가 미래에 와서 바인딩은 있지만 내용이없는 무작위 ng-container본다고 상상해보십시오 async. 더 이상 사용되지 않는다는 가정하에 제거하기로 결정할 수 있습니다.이 경우 전체 tap작업이 더 이상 실행되지 않으며 이에 대해 경고하는 오류가 발생하지 않습니다.

접근 방식 2를 읽는 사람은 무슨 일이 일어나고 있는지 매우 쉽게 볼 수 있으며 구독 수정 결과는 분명합니다.

수동으로 구독을 취소하는 것은 문제가되지 않습니다. 확인 만하면됩니다!

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

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

에서 수정
0

몇 마디 만하겠습니다

0리뷰
로그인참여 후 검토

관련 기사

분류에서Dev

REST API에서 ID 대신 URL을 사용하는 것이 정말 실용적입니까?

분류에서Dev

하나 대신 여러 쿼리를 사용하는 것이 "정상"입니까?

분류에서Dev

이 경우 jquery 대신 angularjs를 사용하는 것이 더 낫습니까?

분류에서Dev

정규식 캡처에 앵커를 포함하는 것이 더 낫습니까?

분류에서Dev

"/ etc / hosts"가있는 웹 사이트를 차단하거나 허용하는 것은 정말로 더 이상 사용되지 않습니까? 대신 무엇을 사용해야합니까?

분류에서Dev

destructuring 대신 require에서 특정 경로를 지정하는 것이 더 효율적입니까?

분류에서Dev

MIPS에서 addi 대 addiu를 사용하는 특정 상황

분류에서Dev

RxJs : subscribe ()에 try / catch를 사용하는 것이 맞습니까?

분류에서Dev

이 특정 상황에서 손상된 패키지를 수정하는 방법은 무엇입니까?

분류에서Dev

내 특정 상황에서 효율성 및 브라우저 지원 측면에서 DOMNodeInserted 또는 ajaxStop이 더 낫습니까?

분류에서Dev

Bumblebee 대신 ubuntu repo에서 Nvidia의 독점 드라이버 (319)를 선택하는 것이 더 낫습니까?

분류에서Dev

Bumblebee 대신 ubuntu repo에서 Nvidia의 독점 드라이버 (319)를 선택하는 것이 더 낫습니까?

분류에서Dev

Bumblebee 대신 ubuntu repo에서 Nvidia의 독점 드라이버 (319)를 선택하는 것이 더 낫습니까?

분류에서Dev

콜백 내에서 dom 요소에 대한 참조를 검색하는 대신 사용하는 것이 더 낫습니까?

분류에서Dev

angularjs에서 $ broadcast를 사용하는 것이 정상입니까?

분류에서Dev

이 특정 상황에서 대소 문자 구분을 제거하는 방법은 무엇입니까?

분류에서Dev

정의에서 "xor"대신 "or"를 사용하는 이유는 무엇입니까?

분류에서Dev

프로젝트 속성 목록이나 별도의 목록에 사용자 지정 키를 저장하는 것이 더 낫습니까?

분류에서Dev

SQL 쿼리의 조인 절에 조건을 추가하는 대신 where를 사용하는 것이 더 낫습니까?

분류에서Dev

PostgreSQL 데이터베이스에 특정 시간대를 설정하는 것은 나쁜 습관입니까?

분류에서Dev

영국 또는 미국 서버를 사용하는 것이 더 낫습니까?

분류에서Dev

Rust println! 특정 상황에서 이상한 문자를 인쇄합니다.

분류에서Dev

C에서 64 비트 플랫폼을 대상으로 할 때 배열 참조에 64 비트 변수를 사용하는 것이 더 낫습니까?

분류에서Dev

Linux에서 RAM 디스크를 만드는 것이 성능 향상에 정말 도움이됩니까?

분류에서Dev

송수신 데이터를 결정하는 것은 무엇이며 커튼 상황에서 크로스 오버 케이블과 스트레이트 스루 케이블이 필요한 이유는 무엇입니까?

분류에서Dev

송수신 데이터를 결정하는 것은 무엇이며 커튼 상황에서 크로스 오버 케이블과 스트레이트 스루 케이블이 필요한 이유는 무엇입니까?

분류에서Dev

$ (pwd) 또는 $ PWD를 사용하는 것이 더 낫습니까?

분류에서Dev

CSS가 특정 상황에서 작동하지 않는 이유

분류에서Dev

특정 Android 버전에 대해서만 인 텐트 필터를 사용하는 방법이 있습니까?

Related 관련 기사

  1. 1

    REST API에서 ID 대신 URL을 사용하는 것이 정말 실용적입니까?

  2. 2

    하나 대신 여러 쿼리를 사용하는 것이 "정상"입니까?

  3. 3

    이 경우 jquery 대신 angularjs를 사용하는 것이 더 낫습니까?

  4. 4

    정규식 캡처에 앵커를 포함하는 것이 더 낫습니까?

  5. 5

    "/ etc / hosts"가있는 웹 사이트를 차단하거나 허용하는 것은 정말로 더 이상 사용되지 않습니까? 대신 무엇을 사용해야합니까?

  6. 6

    destructuring 대신 require에서 특정 경로를 지정하는 것이 더 효율적입니까?

  7. 7

    MIPS에서 addi 대 addiu를 사용하는 특정 상황

  8. 8

    RxJs : subscribe ()에 try / catch를 사용하는 것이 맞습니까?

  9. 9

    이 특정 상황에서 손상된 패키지를 수정하는 방법은 무엇입니까?

  10. 10

    내 특정 상황에서 효율성 및 브라우저 지원 측면에서 DOMNodeInserted 또는 ajaxStop이 더 낫습니까?

  11. 11

    Bumblebee 대신 ubuntu repo에서 Nvidia의 독점 드라이버 (319)를 선택하는 것이 더 낫습니까?

  12. 12

    Bumblebee 대신 ubuntu repo에서 Nvidia의 독점 드라이버 (319)를 선택하는 것이 더 낫습니까?

  13. 13

    Bumblebee 대신 ubuntu repo에서 Nvidia의 독점 드라이버 (319)를 선택하는 것이 더 낫습니까?

  14. 14

    콜백 내에서 dom 요소에 대한 참조를 검색하는 대신 사용하는 것이 더 낫습니까?

  15. 15

    angularjs에서 $ broadcast를 사용하는 것이 정상입니까?

  16. 16

    이 특정 상황에서 대소 문자 구분을 제거하는 방법은 무엇입니까?

  17. 17

    정의에서 "xor"대신 "or"를 사용하는 이유는 무엇입니까?

  18. 18

    프로젝트 속성 목록이나 별도의 목록에 사용자 지정 키를 저장하는 것이 더 낫습니까?

  19. 19

    SQL 쿼리의 조인 절에 조건을 추가하는 대신 where를 사용하는 것이 더 낫습니까?

  20. 20

    PostgreSQL 데이터베이스에 특정 시간대를 설정하는 것은 나쁜 습관입니까?

  21. 21

    영국 또는 미국 서버를 사용하는 것이 더 낫습니까?

  22. 22

    Rust println! 특정 상황에서 이상한 문자를 인쇄합니다.

  23. 23

    C에서 64 비트 플랫폼을 대상으로 할 때 배열 참조에 64 비트 변수를 사용하는 것이 더 낫습니까?

  24. 24

    Linux에서 RAM 디스크를 만드는 것이 성능 향상에 정말 도움이됩니까?

  25. 25

    송수신 데이터를 결정하는 것은 무엇이며 커튼 상황에서 크로스 오버 케이블과 스트레이트 스루 케이블이 필요한 이유는 무엇입니까?

  26. 26

    송수신 데이터를 결정하는 것은 무엇이며 커튼 상황에서 크로스 오버 케이블과 스트레이트 스루 케이블이 필요한 이유는 무엇입니까?

  27. 27

    $ (pwd) 또는 $ PWD를 사용하는 것이 더 낫습니까?

  28. 28

    CSS가 특정 상황에서 작동하지 않는 이유

  29. 29

    특정 Android 버전에 대해서만 인 텐트 필터를 사용하는 방법이 있습니까?

뜨겁다태그

보관