ng-if와 ng-show / ng-hide를 언제 선호합니까?


답변:


703

사용 사례에 따라 다르지만 차이점을 요약하면 다음과 같습니다.

  1. ng-ifDOM에서 요소를 제거합니다. 즉, 모든 처리기 또는 해당 요소에 연결된 다른 모든 항목이 손실됩니다. 예를 들어 클릭 핸들러를 하위 요소 중 하나에 바인딩 한 경우 ng-iffalse로 평가되면 해당 요소가 DOM에서 제거되고 ng-if나중에 true로 평가되어 요소를 표시 한 후에도 클릭 핸들러가 더 이상 작동하지 않습니다 . 핸들러를 다시 연결해야합니다.
  2. ng-show/ng-hideDOM에서 요소를 제거하지 않습니다. CSS 스타일을 사용하여 요소를 숨기거나 표시합니다 (참고 : 자체 클래스를 추가해야 할 수도 있음). 이런 식으로 어린이에게 부착 된 처리기가 손실되지 않습니다.
  3. ng-ifng-show/ng-hide하지 않고 자식 범위를 만듭니다.

DOM을에없는 요소는 덜 성능에 영향을하고 웹 응용 프로그램은 사용할 때 빠른 것으로 나타날 수 ng-if에 비해 ng-show/ng-hide. 내 경험상 그 차이는 무시할 만하다. 모두를 사용할 때 애니메이션이 가능 ng-show/ng-hide하고 ng-if각 문서 모두에 대한 예제.

궁극적으로 대답해야 할 질문은 DOM에서 요소를 제거 할 수 있는지 여부입니다.


19
에서 CSS3 애니메이션을 사용할 수 있습니다 ng-if. 문서 에서 애니메이션 단락과 예제를 확인하십시오 . 또한 숨겨진 요소도 계산 ng-hide/ng-show되므로 CSS 선택기와 같은 :first-child또는 :nth-child제대로 작동하지 않습니다.
Łukasz Wojciechowski

4
angular.dart의 애니메이션 서비스는 비교적 새롭습니다. 이 글을 쓸 당시에는 사용할 수 없었습니다.
markovuksanovic

44
ng-click과 같은 지시문을 사용하여 핸들러를 바인딩하는 경우 먼저 문제가되지 않습니다.
Kevin C.

9
또한 그렇지 않은 ng-if동안 새 범위를 만듭니다 ng-show.
martin

8
DOM에서 요소를 추가하거나 제거하면 자주 수행하는 경우 고성능 비용이 발생할 수 있다는 점도 언급해야합니다.
Kevin C.

130

DOM 방식으로 ng-if / ng-show 작동 방식의 차이를 보여주는 CodePen 은 여기 를 참조 하십시오 .

@markovuksanovic 님이 질문에 잘 답변했습니다. 하지만 다른 관점에서 그것을 올 것 : 나는 것 항상 사용 ng-if하고 DOM에서 이러한 요소를 얻을하지 않는 :

  1. 어떤 이유로 든 $watch보이지 않는 동안 활성 상태를 유지하려면 요소 의 데이터 바인딩과 -es 가 필요합니다 . 전체 양식이 유효한지 여부를 판별하기 위해 현재 표시되지 않은 입력에 대한 유효성을 검사하려는 경우 양식이 좋은 경우입니다.
  2. 위에서 언급했듯이 조건부 이벤트 핸들러와 함께 정교한 정교한 상태 저장 논리를 사용하고 있습니다. , ng-if를 사용할 때 중요한 상태가 손실되도록 처리기를 수동으로 연결 및 분리하는 경우 해당 상태가 데이터 모델에서 더 잘 표현되는지 여부와 처리기가 지시문에 의해 조건부로 적용되는지 여부를 스스로에게 묻습니다. 요소가 렌더링됩니다. 달리 말하면, 핸들러의 유무는 상태 데이터의 한 형태입니다. 해당 데이터를 DOM에서 모델로 가져옵니다. 처리기의 존재 여부는 데이터에 의해 결정되므로 쉽게 다시 만들 수 있습니다.

각도는 정말 잘 쓰여 있습니다. 그것이하는 것을 고려하면 빠릅니다. 그러나 그것이하는 일은 양방향 데이터 바인딩과 같은 어려운 일을 사소하게 쉽게 보이게하는 마술입니다. 모든 것을 쉽게 보이게하려면 성능 오버 헤드가 발생합니다. $digest아무도 보지 않는 DOM 덩어리 에서 사이클 동안 setter 함수가 몇 백 또는 수천 번 평가되는지 알면 충격을받을 수 있습니다 . 그리고 당신은 수십 또는 수백 개의 보이지 않는 요소가 모두 똑같은 일을하고 있음을 알고 있습니다 ...

데스크탑은 대부분의 JS 실행 속도 문제를 무시할 정도로 강력 할 수 있습니다. 그러나 모바일 용으로 개발하는 경우, 가능할 때마다 ng-if를 사용하는 것은 쉬운 일이 아닙니다. JS 속도는 여전히 모바일 프로세서에서 중요합니다. ng-if를 사용하는 것은 매우 저렴한 비용으로 잠재적으로 중요한 최적화를 얻는 매우 쉬운 방법입니다.


6
위의 답변에 아주 좋은 추가. 의사 결정에 도움이되는 좋은 맥락이 있습니다. 감사.
Sean

1
ng-show렌더링 할 때 시간이 많이 걸리는 콘텐츠가 많은 탭이 있으면 유용 할 수 있습니다. 첫 번째 렌더링 후에는 탭 간 이동이 즉시 이루어 지지만 ng-if다시 렌더링, 바인딩 이벤트 등이 필요합니다. 아시다시피 단점은 백그라운드에서 실행되는 시계를 만드는 것입니다. 각도는 필사적으로 필요ng-ifshowwatch
호화 로울지도 모르는

53

내 경험에서 :

1) 페이지에 ng-if / ng-show를 사용하여 무언가를 표시하거나 숨기는 토글이있는 경우 ng-if는 더 많은 브라우저 지연을 발생시킵니다 (느리게). 예를 들어, 두보기 사이를 전환하는 데 사용되는 버튼이 있으면 ng-show가 더 빠른 것 같습니다.

2) ng-if는 true / false로 평가 될 때 범위를 생성 / 파기합니다. ng-if에 컨트롤러가 연결되어 있으면 ng-if가 true로 평가 될 때마다 해당 컨트롤러 코드가 실행됩니다. ng-show를 사용하는 경우 컨트롤러 코드는 한 번만 실행됩니다. 따라서 여러보기 사이를 전환하는 버튼이 있으면 ng-if 및 ng-show를 사용하면 컨트롤러 코드 작성 방법에 큰 차이가 있습니다.


5
대단한 사실입니다! ng-if가 반드시 프론트 엔드를 더 빨리 만드는 것은 아닙니다. 그것은 당신의 필요에 달려 있습니다. 실제로 잘못된 상황에서 사용하는 경우 다른 방법으로 만들 수 있습니다.
Thiago C. S Ventura

1
그러나 ng-if가 DOM으로 렌더링되지 않으므로 ng-show / hide에 비해 빠릅니다. 내가 잘못 pls 그 시점에서 수정하자.
Pardeep Jain

1
ng-if는 false로 평가되면 더 빠릅니다. 왜냐하면 DOM에 삽입 할 필요가 없기 때문입니다. 그러나 그것이 사실이라면, 아마도 상당히 복잡한 요소를 DOM에 삽입하는 오버 헤드가 있습니다.
Mawg는 모니카

"2) ng-if는 true / false로 평가 될 때 범위를 생성 / 파기합니다. ng-if에 컨트롤러가 연결되어 있으면"
The Red Pea

35

대답은 간단하지 않습니다 :

대상 컴퓨터 (모바일 대 데스크톱), 데이터의 특성, 브라우저, OS, 실행되는 하드웨어에 따라 다릅니다. 실제로 알고 싶다면 벤치마킹해야합니다.

대부분 메모리와 계산 문제입니다 ... 대부분의 성능 문제로 인해 목록과 같은 반복되는 요소 (n), 특히 중첩 된 경우 (nxn 이상)와 이러한 요소 내에서 실행 되는 계산의 종류에 따라 차이가 커질 수 있습니다 :

  • ng-show : 90 %의 시간과 같이 선택적인 요소가 종종 존재하는 경우 (밀도가 높을 경우), 특히 내용이 싼 경우 (예 : 일반 텍스트 만) 계산 또는로드). 숨겨진 요소로 DOM을 채울 때 메모리를 소비하지만 이미 존재하는 것을 표시 / 숨기기하면 브라우저에서 저렴한 작업 일 수 있습니다.

  • ng-if : 반대로 요소가 표시되지 않는 경우 (스파 스) 실시간으로 요소를 빌드하고 파괴하십시오. 특히 내용이 비싸면 (계산 / 정렬 / 필터링 된 이미지, 생성 된 이미지). 이는 드문 또는 '주문형'요소에 이상적이며 DOM을 채우지 않는 측면에서 메모리를 절약하지만 많은 계산 (요소 작성 / 파기) 및 대역폭 (원격 컨텐츠 가져 오기)을 수행 할 수 있습니다. 또한 뷰에서 계산하는 양 (필터링 / 정렬)과 모델에 이미있는 것 (사전 정렬 / 사전 필터링 된 데이터)에 따라 다릅니다.


2
기술적 사실에 대한 다른 답변. 이것은 지혜입니다. 간단하지 않은 Angular 앱을 명확하게 구축했습니다! +1
poshest

이 문제는 각도를 넘어서고, 컴퓨터 과학의 근본적인 문제이며, 한 가지 방법이 다른 방법보다 효율적이라는 점이 있습니다. 일반적으로 이것은 일부 벤치마킹을 통해 찾을 수 있습니다. 따라서 항목 수에 따라 한 방법과 다른 방법 사이를 전환 할 수도 있습니다 ... 비슷한 주제 : math.stackexchange.com/questions/1632739/…
Christophe Roussy

12

중요한 참고 사항 :

ngIf (ngShow와 달리)는 일반적으로 예기치 않은 결과를 생성 할 수있는 자식 범위를 만듭니다.

나는 이것과 관련된 문제가 있었고 무슨 일이 일어나고 있는지 알아내는 데 많은 시간을 보냈습니다.

(내 지시서는 모델 값을 잘못된 범위에 쓰고있었습니다.)

따라서 머리카락을 절약하려면 너무 느리게 달리지 않는 한 ngShow를 사용하십시오.

어쨌든 성능 차이는 거의 눈에 띄지 않으며 테스트를 거치지 않은 사람이 누구에게 유리한지 아직 확실하지 않습니다 ...


8
사용 $parent.scopevar내에서 데이터 바인딩에 ngIf하여 사용하는 경우 자녀 범위 문제 등을 해결할 것 ngIf
meconroy을

2
이것은 전적으로 사실이 아닙니다 (원래 @ user2173353의 의견). 모범 사례를 고수해도 문제가 발생하지 않습니다. 그것은 아주 기본적인 규칙입니다 : "점이 없으면 잘못하고 있습니다". 작동 방식에 대한 데모는 여기 ( bit.ly/1SPv4wL)를 참조하십시오 . 또 다른 위대한 참조 (실수 # 2 참조) : bit.ly/1QfFeWd > (내 지시어는 모델 값을 잘못된 범위에 쓰고있었습니다.) 이것은 위의 관행에 충실하지 않은 결과입니다.
piotr.d

1
@ piotr.d 당신이 옳지 만, 초보자가 집중해야 할 것이 아니며, 마지막으로 성능 향상을 유지하는 것이 좋습니다 (특히 현실에서는 향상되지 않을 수있는 성능 향상)라는 더 좋은 모범 사례가 있습니다. ). 나는 ngIf이것이 성능을 향상시킬 것이라고 믿는 사람들을 어디에나 두는 것을 보았습니다 . 이것은 단순히 사실이 아니다 하나는 최고입니다, 어떤 말할 수 없다 ngIf거나 ngShow테스트 또는 특별한 경우에 깊은 분석없이. 그래서, 나는 아직도 잊고 추천 ngIf한 나쁜 성능을보고 나 자신이 무엇을하고 있는지 알고 때까지
user2173353

2
좋은 지적. 그러나 controllerAs를 사용하면 이것이 문제가되지 않습니다. 예를 들어, John Papa의 controllerAs 및 vm을 참조하십시오 .
jsruok

4

ng-include 및 ng-controller에서 ng-if는 ng-include에 큰 영향을 미치며 필요한 부분을로드하지 않으며 ng-controller에서 플래그가 true가 아니면 플래그가 아닌 한 컨트롤러를로드하지 않습니다. 사실이지만 문제는 ng-if에서 플래그가 false 인 경우 플래그가 true가 될 때 DOM에서 제거되면이 경우 DOM을 다시로드합니다. ng-show가 더 좋습니다. 한 번 동안 ng-if가 더 좋습니다


4

ng-show or ng-hide컨텐츠 를 사용 하는 경우 (예 : 서버의 썸네일) 표현식의 값에 관계없이로드되지만 표현식의 값에 따라 표시됩니다.

당신 ng-if이 콘텐츠 를 사용 하면 ng-if의 표현이 진실로 평가되는 경우에만로드됩니다.

ng-if를 사용하는 것은 서버에서 데이터 또는 이미지를로드하고 사용자 상호 작용에 따라 이미지 또는 이미지 만 표시하려는 경우에 좋습니다. 이렇게하면 불필요한 nw 집중 작업으로 페이지로드가 차단되지 않습니다.


CSS가 DOM 컨테이너를 숨기더라도 대부분의 브라우저가 이미지를로드하므로 특히 유용합니다. 그들은 일반적으로 태그가로드되면 태그 의 src속성을 찾습니다 img!
Christophe Roussy 8
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.