AngularJS 지시어 란 무엇입니까?


181

AngularJS 설명서와 여러 자습서를 읽는 데 많은 시간을 보냈으며 설명서가 얼마나 접근하기 어려운지 놀랐습니다.

AngularJS를 선택하는 다른 사람들에게도 유용 할 수있는 간단하고 대답 가능한 질문이 있습니다.

AngularJS 지시어 란 무엇입니까?

어딘가에 지시문에 대한 간단하고 정확한 정의가 있어야하지만 AngularJS 웹 사이트 는 놀랍게도 쓸모없는 정의를 제공합니다.

홈페이지에서 :

지시문은 AngularJS에서 사용할 수있는 독특하고 강력한 기능입니다. 지시문을 사용하면 응용 프로그램에 맞는 새로운 HTML 구문을 만들 수 있습니다.

에서 개발자 문서 :

지시문은 HTML 새로운 트릭을 가르치는 방법입니다. DOM 컴파일 중 지시문은 HTML과 일치하여 실행됩니다. 이를 통해 지시문이 동작을 등록하거나 DOM을 변환 할 수 있습니다.

그리고 아이러니하게도, 관객들이 이미 자신들이 무엇인지 이해한다고 가정하는 지시문에 대한 일련의 이야기 가 있습니다.

누구든지 명확한 참조를 위해 지시어가 무엇인지 설명하는 정확한 정의를 제공 할 수 있습니까?

  1. 그것이 무엇입니까 ( 예를 들어 jQuery 의 명확한 정의 참조 )
  2. 어떤 실질적인 문제와 상황을 다루려고 하는가
  3. 어떤 디자인 패턴을 구현하거나 대안 으로 AngularJS의 취지에 따른 MVC / MVW 미션에 적합한 지 .

2
당신은에서 ... 나를 한 예로서 jQuery를의 명확한 정의를 참조하십시오.
joshuamabina

2012 년에 스택 오버플로가 어떻게 진행되었는지 잘 모르겠지만이 질문을 수정하고 "angular-directive"태그를 추가했습니다. 그것의 태그 정보는 사실은 꽤 명확한 정의를 제공합니다. 또한 개발자 문서에서 두 번째 인용문을 찾을 수 없습니다.
user4642212

답변:


142

그것은 무엇입니까 (예를 들어 jQuery의 명확한 정의 참조)?

지시문은 본질적으로 Angular 컴파일러가 DOM에서 찾을 때 실행 되는 함수 입니다. 함수는 거의 모든 것을 할 수 있으므로 지시문이 무엇인지 정의하기가 다소 어렵다고 생각합니다. 각 지시어에는 ng-repeat, tab, make-up-your-own과 같은 이름이 있으며 각 지시어는 주석에서 요소, 속성, 클래스 등을 사용할 수있는 위치를 결정합니다.

지시문에는 일반적으로 (포스트) 링크 기능 만 있습니다. 복잡한 지시문에는 컴파일 기능, 사전 연결 기능 및 사후 연결 기능이있을 수 있습니다.

어떤 실질적인 문제와 상황이 해결되어야합니까?

지시어가 할 수있는 가장 강력한 일은 HTML을 확장하는 것입니다. 확장은 응용 프로그램을 빌드하기위한 DSL ( Domain Specific Language )입니다. 예를 들어, 응용 프로그램이 온라인 쇼핑 사이트를 운영하는 경우 "쇼핑 카트", "쿠폰", "특별"등 지시문을 갖도록 HTML을 확장 할 수 있습니다. 'div'및 'span'이 아닌 온라인 쇼핑 '도메인 (@WTK에서 이미 언급 한대로).

지시문은 HTML을 구성 요소화할 수도 있습니다. HTML을 재사용 가능한 구성 요소로 묶습니다. ng-include를 사용하여 많은 HTML을 가져 오면 지시문을 리팩터링해야 할 때입니다.

어떤 디자인 패턴을 구현하거나 대안으로 angularjs의 의도 된 MVC / MVW 미션에 적합합니까?

지시문은 DOM을 조작하고 DOM 이벤트를 포착하는 위치입니다. 이것이 지시문의 컴파일 및 링크 함수가 모두 "요소"를 인수로받는 이유입니다. 당신은 할 수 있습니다

  • 지시문을 대체 할 HTML (예 : 템플리트) 무리를 정의하십시오.
  • 이 요소 (또는 그 자식)에 이벤트를 바인딩
  • 수업 추가 / 제거
  • text () 값을 변경하십시오
  • 동일한 요소에 정의 된 속성에 대한 변경 사항을 감시합니다 (실제로 관찰되는 속성의 값입니다. 이는 범위 속성이므로 지시어는 "모델"을보고 변경 사항을 감시합니다)
  • 기타


HTML에서 우리는 같은 일이 <a href="...">, <img src="...">, <br>, <table><tr><th>. a, href, img, src, br, table, tr 및 th가 무엇인지 어떻게 설명 하시겠습니까? 이것이 지시어입니다.


2
마크 고마워 나는 이것이 분명하고 아마도 정확한 대답에 가장 가깝다고 생각합니다. 지시문이 항상 html 태그에 바인딩되어 있다고 생각합니까? 지시어가 HTML 태그에 바인딩 된 함수라고 말하는 것이 더 정확할 것입니다. 따라서 HTML 언어를 선언적으로 확장 할 수 있습니다.
tohster

주석에 지시문을 사용할 수 있으므로 모든 지시문을 HTML 태그에 바인딩 할 필요는 없습니다. 예 :<!-- directive: my-directive exp -->
Mark Rajcok

마크, 이것이 지시어를 관례 적으로 사용하는 것입니까? 즉, 지시문은 일반적으로 HTML을 확장하는 데 사용되며 용도가 있습니다.
tohster

9
알았어 이제 더 잘 이해하고있어 이를 고려하는 한 가지 방법은 다음과 같습니다. 1. DSL은 일반적으로 구문 트리를 나타냅니다 . 2. HTML DOM은 DSL 구문 트리이지만 굳은 것입니다. 3. AngularJS 및 지시문 메커니즘은 개발자가 사용자 정의 트리 노드를 구축 할 수 있도록하여 HTML DOM을보다 유연하게 만듭니다. 이 노드는 새로운 행동, 또는 기존 행동 (하위 트리)의 집계 나타낼 수 4. 따라서, 지시어는 HTML DOM 사용자 정의 DSL로 진화 할 수 있도록
tohster

1
@MarkRajcok 나는 당신의 마지막 단락으로 고심하고 있습니다. 일반 <div></div>은 지시어입니까? 당신은 그렇습니다. 그러나 여기에 장식없습니다 (요소, 클래스, 주석, 속성을 통해). 여기 사람들은 이것이 HTML DOM의 표식 이라고 말합니다 . 당신은 명확히 할 수 있습니까? (나는 당신이 같은 평범한 요소에 대한 지시어를 만들 수있는 원인에 대해서는 이야기하고 있지 않다 <div>)
Royi Namir

11

각도 지시어에 대한 실제로 간단하고 초기 정의는 다음과 같습니다.

AngularJS 지시문 (ng-directives)은 Angular에서 HTML을 확장하는 데 사용되는 ng 접두사 (ng-model, ng-app, ng-repeat, ng-bind)가있는 HTML 특성입니다. ( 에서 : W3schools 각도 튜토리얼 )

이것의 몇 가지 예는

NG-응용 프로그램 지시자는 AngularJS와 응용 프로그램을 정의합니다.

NG 모델 지시자는 애플리케이션 데이터를 제어 HTML (입력, 선택한 텍스트 영역)의 값을 결합한다.

NG-바인드 하는 HTML보기로 지시 바인딩 응용 프로그램 데이터.

<div ng-app="">
    <p>Name: <input type="text" ng-model="name"></p>
    <p ng-bind="name"></p>
</div>

적어도이 튜토리얼은 Angular에 대한 가장 좋은 소개 중 하나였습니다. 더 완벽한 접근 방식은 @ mark-rajcok이 이전에 말한 모든 것입니다.


4

문서를 보면 지시문은 객체와 동작을 만들기 위해 angularjs가 구문 분석 할 수있는 구조입니다. 위젯 (구성 요소)의 구조, 작동 방식 및 데이터를 제공하는 방법 그런 다음 Angularjs는 이러한 지시문 에 대해 실행하여 html / javascript 코드가 작동하도록 변환합니다.

지시어가 있으므로 올바른 의미를 사용하여 더 복잡한 구성 요소 (위젯)를 작성할 수 있습니다. 지시문의 angularjs 예제를 살펴보십시오-탭 창을 정의하고 있습니다 (물론 일반 HTML에서는 유효하지 않습니다). div-s 또는 span과 같은 구조를 사용 하여 탭 창 처럼 보이 도록 구조를 만드는 것보다 직관적 입니다.


나는 기술적 인 설명이 약간 덜하다고 느끼는 것을 덧붙였다.
raam86

1
고마워 이것은 매우 도움이됩니다. 따라서 구성 요소를 캡슐화하고 속성과 동작으로 설명하고 인스턴스화 할 수 있으며 DOM에 자신을 표현할 수있는 일종의 동적 템플릿 (OO 프로그래밍의 클래스와 유사)이라고 생각할 수 있습니까? 그리고 그것이 존재하는 이유 (javascript 객체 또는 html 템플릿)는 HTML 태그가보다 역동적이고 객체와 유사한 동작을 수행하여 OO 유형 프로그래밍에서 조작 가능하게되기 시작하기 때문입니까?
tohster

예, 아니오 지시어 가 존재 하는 이유는 지시어 가 OO 프로그래밍에서 조작 할 수있는 것과 관련이 있다고 말할 수는 없습니다 . 사실 프레임 워크에 대한 전체 angularjs 접근 방식은 OO Javascript 코드를 작성하는 대신 HTML 및 임의의 DOM 노드 속성과 크게 관련되어 있다고 느낍니다. 나는 angularjs가 매일 문제를 해결하는 방법의 모든 예를 살펴보면서 그 분위기를 얻습니다. 지시어 뒤에 있는 주된 이유 는 하나의 의미 적으로 구조화 된 구성 요소에 동작과 데이터를 포함시키는 방법이 있기 때문 입니다.
WTK December

3

AngularJS 지시문에는 AngularJS의 HTML 컴파일러 ($ 컴파일) DOM 요소에 지정된 동작을 수행하거나 심지어 DOM 요소와 그 자식을 변환합니다. 일부 예는 ng-bind, ng-hide / show 등입니다.


2

홈페이지는 이것에 대해 매우 분명합니다 : 마지막 섹션에서 탭 위로 마우스를 가져 가면 :

우리는 커스텀 tabs 요소로 HTML의 어휘를 확장했습니다 . 는 tabs탭의 렌더링에 필요한 복잡한 HTML 구조와 동작을 추상화합니다. 그 결과 더 읽기 쉬운 뷰와 매우 쉽게 재사용 가능한 구문이 완성되었습니다. "

그런 다음 다음 탭에서

angular.module('components', []).
  directive('tabs', function() {
    return {
      restrict: 'E',
      transclude: true,
      scope: {},
      controller: function($scope, $element) {
        var panes = $scope.panes = [];

        $scope.select = function(pane) {
          angular.forEach(panes, function(pane) {
            pane.selected = false;
          });
          pane.selected = true;
        }

따라서 html 요소를 발명 할 수 있습니다. 즉 tabs, 각도로 해당 요소의 렌더링을 처리 할 수 있습니다 .


2
빠른 응답 감사합니다! 따라서 지시문의 목적은 사용자 정의 태그 및 속성을 작성하여 HTML 어휘를 확장하는 것입니까? "MVW"보다 훨씬 광범위한 문제 범위를 다루는 것처럼 보이지만 상당히 강력 해 보입니다. BTW 다른 사람들은 동의하지 않을 수 있지만 페이지 하단으로 스크롤 한 다음 하이퍼 링크 단어 위로 마우스를 가져간 다음 '지시적'이라는 단어를 언급하지 않은 팝업 툴팁을 읽는 것은 " 지시어가 무엇인지에 대한 명확한 정의. 그럼에도 불구하고 빠른 응답에 감사드립니다.
tohster

예! 그들이 만든이 바이올린을 확인할 수 있습니다. 실제 html은 html 창에서 설정과 다릅니다.
raam86
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.