Що таке директива AngularJS?


181

Я провів досить багато часу, читаючи документацію AngularJS та кілька навчальних посібників, і я був дуже здивований тим, наскільки ця документація недоступна.

У мене є просте, відповідальне запитання, яке також може бути корисним для інших, хто хоче підібрати AngularJS:

Що таке директива AngularJS?

Десь має бути просте, точне визначення директиви, але веб-сайт AngularJS пропонує ці дивно марні визначення:

На домашній сторінці :

Директиви - це унікальна і потужна функція, доступна в AngularJS. Директиви дозволяють вигадувати новий синтаксис HTML, характерний для вашої програми.

У документації для розробника :

Директиви - це спосіб навчити HTML нових хитрощів. Під час компіляції DOM директиви співпадають з HTML і виконуються. Це дозволяє директивам реєструвати поведінку або трансформувати DOM.

І є низка розмов про директиви, які, як не дивно, припускають, що аудиторія вже розуміє, що вони є.

Хтось міг би запропонувати для чіткого посилання точне визначення того, що таке директива, що пояснює:

  1. Що це таке (див. Чітке визначення jQuery як приклад)
  2. Які практичні проблеми та ситуації він має на меті вирішити
  3. Який шаблон дизайну вона втілює, або в якості альтернативи, як вона вписується в претендував MVC / MVW місії AngularJS.

2
Ви мали мене в ... див. Чітке визначення jQuery як приклад.
Джошуамабіна

Не впевнений, як це було в 2012 році на Stack Overflow, але я просто переглянув це питання і додав тег «angular-direktiva». Його інформація тег на насправді дає досить чітке визначення. Також я помітив, що не можу знайти другу цитату в документах розробника…
user4642212

Відповіді:


142

Що це таке (див. Чітке визначення jQuery як приклад)?

Директива - це по суті функція †, яка виконується, коли кутовий компілятор знайде її в DOM. Функції можуть виконувати практично все, саме тому я вважаю, що визначити, що таке директива, досить складно. Кожна директива має назву (наприклад, ng-повторення, вкладки, макіяж-свій-власний), і кожна директива визначає, де її можна використовувати: елемент, атрибут, клас, у коментарі.

Директива, як правило, має лише функцію (пост) зв'язку. Складна директива може мати функцію компіляції, функцію попереднього посилання та функцію після посилання.

З якими практичними проблемами та ситуаціями планується вирішити?

Найпотужніші директиви, які можна зробити, - це розширити HTML. Ваші розширення - це мова, орієнтована на домен (DSL) для створення вашої програми. Наприклад, якщо ваша програма працює на веб-сайті для покупок, ви можете розширити HTML, щоб мати директиви "кошик для покупок", "купон", "спеціальні" тощо. Інтернет-домен ", а не" div "і" span "s (як @WTK вже згадувалося).

Директиви також можуть складати HTML - згрупувати купу HTML у якийсь компонент для багаторазового використання. Якщо ви виявите, що використовуєте ng-include для отримання великої кількості HTML-кодів, напевно, час перетворити на директиви.

Яку модель дизайну вона втілює, або, як альтернатива, як вона вписується в передбачувану місію МВС / МВС angularjs

Директиви - це те, де ви маніпулюєте 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 -->
Марк Райчко

Позначте, чи це буде нетрадиційне використання директиви? тобто директиви звичайно використовуються і призначені для розширення 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-директиви) - це атрибути HTML з префіксом ng (ng-модель, ng-додаток, ng-повторення, ng-прив'язка), що використовується Angular для розширення HTML. ( з: Кутовий підручник W3schools )

Деякі приклади цього були б

Нг-додаток директива визначає додаток AngularJS.

Нг-модель директива пов'язує значення HTML управління (введення, виберіть текстову області ) до прикладних даних.

Нг-зв'язування директива пов'язує дані додатки з точки зору HTML.

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

Перевірте цей підручник, принаймні для мене це був один із найкращих вступів до Angular. Більш повним підходом було б все, про що раніше говорив @ mark-rajcok.


4

Дивлячись на документацію, директиви - це структури, ви можете записати, що angularjs розбирає, щоб створити об'єкти та поведінку. Іншими словами, це шаблон, в якому ви використовуєте суміш будь-яких довільних вузлів та псевдо-javascript та заповнювачів для даних, щоб висловити наміри того, як ваш віджет (компонент) структурований, як він веде себе і як він подається з даними. Потім Angularjs протистоїть цим директивам, щоб перевести їх у робочий код html / javascript.

Директиви існують, щоб ви могли будувати складніші компоненти (віджети), використовуючи належну семантику. Просто подивіться на приклад директив angularjs - вони визначають область вкладок (що звичайно не є дійсним у звичайному HTML). Це більш інтуїтивно зрозуміло, ніж використовувати на зразок div-s або прольоти для створення структури, яка потім стилізується так, щоб виглядати як панель вкладок.


Я додав те, що мені здається, трохи меншим технічним поясненням.
raam86

1
Спасибі це дуже корисно. Тож, може, я можу вважати це як своєрідний динамічний шаблон (подібний класу в програмуванні OO), який інкапсулює компонент, описує його за властивостями та поведінкою, може інстанціюватися і може виразити себе в DOM? І причина, що існує (порівняно з об’єктом JavaScript або html-шаблоном) полягає в тому, щоб дозволити тегам HTML приймати більш динамічні, об'єктоподібні поведінки, щоб вони могли почати маніпулювати в програмуванні типу OO?
Тостер

Так і ні. Я б не сказав, що причина директив існує багато спільного з тим, щоб ними керувати в програмуванні ОО. Насправді, цілий підхід angularjs до фреймворку значно більше пов'язаний з атрибутами HTML і довільними атрибутами DOM, а не з написанням коду JaO OO. Мені здається, що я переглядаю всі приклади того, як angularjs вирішує проблеми щодня. Я б сказав, що головна причина директив полягає в тому, щоб вкласти спосіб поведінки та даних в один семантично структурований компонент.
WTK

3

У директивах AngularJS є HTML-маркери для елемента HTML DOM, такі як атрибут (обмеження A), ім'я елемента (обмеження-E), коментар (обмеження-M) або клас CSS (обмеження - С), які повідомляють компілятор HTML AngularJS ($ компілювати) для виконання заданої поведінки для цього елемента DOM або навіть перетворення елемента DOM та його дітей. Прикладом деяких є ng-bind, ng-hid / show тощо


2

На цьому домашня сторінка чітко зрозуміла. Коли ви наведіть курсор на вкладки в останньому розділі:

Ми розширили словник HTML за допомогою спеціального tabs елемента. 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 інші можуть не погодитися, але я думаю, що прокрутка донизу сторінки, а потім наведення курсору на слово з гіперпосиланнями, а потім читання спливаючої підказки, яка жодного разу не згадує слово "директива", - це не зовсім ". дуже чітке "визначення того, що таке директива. Тим не менш, дуже цінуємо швидку відповідь.
Тостер

Так! Ви можете перевірити цю скрипку, яку вони зробили. Фактичний html відрізняється від включеного на панелі html.
raam86
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.