정말 좋은 질문입니다! 나는 것 좋아하는 다른 사람이 무슨 말을하는지 듣고, 그러나 여기 내가 사용하는 지침입니다.
고도 전제 : 범위는 상위 컨트롤러, 지시문 및 지시문 템플릿간에 통신하는 데 사용되는 "접착제"로 사용됩니다.
부모 범위 : scope: false
이므로 전혀 새로운 범위가 없습니다.
나는 이것을 자주 사용하지 않지만 @MarkRajcok가 말했듯이 지시어가 범위 변수에 액세스하지 않으면 (그리고 분명히 설정되지 않았습니다!), 이것은 내가 걱정하는 한 괜찮습니다. 이것은 부모 지시문의 컨텍스트 에서만 사용되며 (항상 예외는 있지만) 템플릿이없는 자식 지시문에도 유용합니다 . 기본적으로 템플릿이있는 것은 범위를 공유하는 것이 아닙니다. 왜냐하면 본질적으로 액세스 및 조작을 위해 해당 범위를 노출하기 때문입니다 (그러나이 규칙에는 예외가 있다고 확신합니다).
예를 들어, 최근에는 작성중인 SVG 라이브러리를 사용하여 (정적) 벡터 그래픽을 그리는 지시문을 만들었습니다. 이 $observe
두 가지 특성 (들 width
과 height
그 어느 세트) 및 용도의 계산에 해당하지만,이 범위도 임의의 변수를 판독하고, 어떤 템플릿이 없다. 다른 범위를 만들지 않는 좋은 사용 사례입니다. 우리는 필요하지 않으므로 왜 귀찮게합니까?
그러나 다른 SVG 지시문에서 사용할 데이터 세트가 필요했으며 추가로 약간의 상태를 저장해야했습니다. 이 경우 부모 범위를 사용하는 것은 무책임합니다 (다시 말해서). 그래서 대신에...
아동 범위 : scope: true
자식 범위가있는 지시문은 상황을 인식하며 현재 범위와 상호 작용하기위한 것입니다.
분명히, 격리 범위에 비해 이것의 주요 장점은 사용자가 원하는 속성에 대해 보간을 자유롭게 사용할 수 있다는 것입니다. 예를 들어 class="item-type-{{item.type}}"
격리 범위와 함께 지시문을 사용하면 기본적으로 작동하지 않지만 보간 된 항목은 여전히 기본적으로 부모 범위에서 찾을 수 있기 때문에 자식 범위가있는 지시문에서는 제대로 작동합니다. 또한 지시문 자체는 부모의 오염이나 손상에 대한 걱정없이 자체 범위의 맥락에서 속성과 표현을 안전하게 평가할 수 있습니다.
예를 들어 툴팁은 추가 된 것입니다. 격리 범위는 작동하지 않습니다 (기본적으로 아래 참조). 여기서 다른 지시문이나 보간 된 속성을 사용할 것으로 예상되기 때문입니다. 툴팁은 개선 된 기능입니다. 그러나 툴팁은 하위 지시문 및 / 또는 템플릿과 함께 사용하고 분명히 자체 상태를 관리하기 위해 범위에 몇 가지 사항을 설정해야하므로 실제로 부모 범위를 사용하는 것은 매우 나쁩니다. 우리는 그것을 오염 시키거나 손상시키고 있으며 부에노도 아닙니다.
독립 또는 부모 범위보다 자식 범위를 더 자주 사용합니다.
범위를 분리하십시오. scope: {}
재사용 가능한 구성 요소를위한 것입니다. :-)
그러나 심각하게도 "재사용 가능한 구성 요소"는 "자체 포함 된 구성 요소"라고 생각합니다. 의도는 특정 목적으로 사용되어야하기 때문에 다른 지시문과 결합하거나 다른 보간 속성을 DOM 노드에 추가하는 것은 본질적으로 의미가 없습니다.
보다 구체적으로,이 독립형 기능에 필요한 모든 것은 상위 범위의 컨텍스트에서 평가 된 지정된 속성을 통해 제공됩니다. 단방향 문자열 ( '@'), 단방향 표현식 ( '&') 또는 양방향 변수 바인딩 ( '=')입니다.
자체 포함 된 구성 요소에서는 다른 지시문이나 속성이 자체적으로 존재하기 때문에 적용 할 필요가 없습니다. 스타일은 자체 템플릿 (필요한 경우)에 따라 결정되며 필요한 경우 적절한 내용을 포함 할 수 있습니다. 독립형이므로 격리 범위에 배치하여 "이 문제를 해결하지 마십시오. 몇 가지 속성을 통해 정의 된 API를 제공합니다."
가장 좋은 방법은 지시문 링크 및 컨트롤러 기능에서 가능한 많은 템플릿 기반 항목을 제외하는 것입니다. 이는 또 다른 "API와 같은"구성 지점을 제공합니다. 지시문의 사용자는 단순히 템플릿을 바꿀 수 있습니다! 기능은 모두 동일하게 유지되었으며 내부 API는 절대 손대지 않았지만 필요한만큼 스타일과 DOM 구현을 망칠 수 있습니다. ui / bootstrap은 Peter & Pawel이 훌륭하기 때문에 이것을 잘하는 좋은 예입니다.
격리 범위도 변환과 함께 사용하기에 좋습니다. 탭을 가지고; 그것들은 전체 기능 일뿐만 아니라 그 안에 있는 모든 것을 부모 범위 내에서 자유롭게 평가할 수 있으며 원하는대로 탭과 창을 남겨 둡니다. 탭은 분명히 자신의 상태 를 가지고 있으며, 이는 템플릿과 상호 작용하기 위해 범위에 속하지만 해당 상태는 사용 된 컨텍스트와 아무런 관련이 없습니다. 탭 지시문을 탭 지시문으로 만드는 것은 전적으로 내부적입니다. 또한 탭과 함께 다른 지시문을 사용하는 것은 의미가 없습니다. 그것들은 탭입니다-우리는 이미 그 기능을 가지고 있습니다!
더 많은 기능으로 둘러싸거나 더 많은 기능을 포함 시키지만 지시문은 이미 그 기능입니다.
그러나 @ProLoser가 그의 대답에서 암시 한 것처럼 격리 범위의 일부 제한 (예 : 기능)을 둘러싼 방법이 있음에 유의해야합니다. 예를 들어 자식 범위 섹션에서 격리 범위를 사용할 때 비 기본 속성 파괴에 대한 보간에 대해 언급했습니다 (기본적으로). 그러나 사용자는 예를 들어 간단하게 사용할 수 class="item-type-{{$parent.item.type}}"
있으며 다시 작동합니다. 따라서 하위 범위에 대해 격리 범위를 사용해야하는 강력한 이유가 있지만 이러한 제한 중 일부에 대해 걱정이되는 경우 필요한 경우 거의 모든 문제를 해결할 수 있습니다.
요약
새로운 범위가없는 지시문은 읽기 전용입니다. 그들은 완전히 신뢰할 수 있으며 (즉, 앱 내부) 잭을 만지지 않습니다. 자식 범위가있는 지시문은 기능을 추가 하지만 유일한 기능 은 아닙니다 . 마지막으로 격리 범위는 전체 목표 인 지시문에 대한 것입니다. 그것들은 독립형이기 때문에, 그들이 도둑질을하는 것은 괜찮습니다.
나는 초기 생각을 꺼내고 싶었지만 더 많은 것을 생각할 때 이것을 업데이트 할 것입니다. 그러나 거룩한 쓰레기-이것은 SO 답변을 기다리는 데 오래입니다 ...
추신 : 완전히 접선이지만 범위에 대해 이야기하고 있기 때문에 나는 "프로토 타입"이라고 말하고 다른 사람들은 "프로토 타입"을 선호합니다. :-)