Как да създадем CUSTOM директива в AngularJS с пример

Съдържание:

Anonim

Какво е потребителска директива?

Персонализирана директива в Angular Js е дефинирана от потребителя директива с желаната от вас функционалност. Въпреки че AngularJS има много мощни директиви извън кутията, понякога се изискват персонализирани директиви.

В този урок ще научите -

  • Как да създам персонализирана директива?
  • Директиви и обхват на AngularJs
  • Използване на контролери с директиви
  • Как да създадете директиви за многократна употреба
  • Директиви и компоненти на AngularJS - ng-transclude
  • Вложени директиви
  • Обработка на събития в директива

Как да създам персонализирана директива?

Нека да разгледаме пример за това как можем да създадем персонализирана директива.

Потребителската директива в нашия случай просто ще инжектира div таг, който има текст "AngularJS Tutorial" в нашата страница, когато директивата бъде извикана.

Event Registration

Guru99 Global Event

Обяснение на кода:

  1. Първо създаваме модул за нашето ъглово приложение. Това се изисква за създаване на персонализирана директива, защото директивата ще бъде създадена с помощта на този модул.
  2. Сега създаваме персонализирана директива, наречена "ngGuru" и дефинираме функция, която ще има персонализиран код за нашата директива.

Забележка:-

Имайте предвид, че когато дефинираме директивата, ние я дефинирахме като ngGuru с буквата „G“ като капитал. И когато го достъпваме от нашия div таг като директива, ние го използваме като ng-guru. Ето как angular разбира потребителските директиви, дефинирани в приложение. Първо името на потребителската директива трябва да започва с буквите 'ng'. На второ място символът на тирето „-“ трябва да се споменава само при извикване на директивата. И на трето място, първата буква след буквите „ng“ при дефиниране на директивата може да бъде или с малка, или с главна буква.

  1. Използваме параметъра на шаблона, който е параметър, дефиниран от Angular за потребителски директиви. В това ние определяме, че когато се използва тази директива, просто използвайте стойността на шаблона и го инжектирайте в извикващия код.
  2. Тук вече използваме нашата създадена по поръчка директива "ng-guru". Когато направим това, стойността, която дефинирахме за нашия шаблон „
    Angular JS Tutorial
    “, сега ще бъде инжектирана тук.

Ако кодът се изпълни успешно, след стартиране на вашия код в браузъра ще се покаже следният изход.

Изход:

  • Горният изход ясно показва, че нашата потребителска директива ng-guru, която има шаблон, дефиниран за показване на персонализиран текст, се показва в браузъра.

Директиви и обхват на AngularJs

Обхватът се определя като лепилото, което свързва контролера с изгледа чрез управление на данните между изгледа и контролера.

Когато създават персонализирани директиви AngularJs, те по подразбиране ще имат достъп до обекта на обхвата в родителския контролер.

По този начин става лесно за потребителската директива да използва данните, които се предават на главния контролер.

Нека разгледаме пример за това как можем да използваме обхвата на родителски контролер в нашата персонализирана директива.

Event Registration

Guru99 Global Event

Обяснение на кода:

  1. Първо създаваме контролер, наречен "DemoController". В това, ние дефинираме променлива, наречена tutorialName, и я прикачваме към обекта на обхвата в едно изявление - $ scope.tutorialName = "AngularJS".
  2. В нашата потребителска директива можем да извикаме променливата "tutorialName", като използваме израз. Тази променлива ще бъде достъпна, защото е дефинирана в контролера "DemoController", който ще стане родител за тази директива.
  3. Препращаме към контролера в div таг, който ще действа като родителски div таг. Имайте предвид, че това трябва да се направи първо, за да може нашата персонализирана директива да има достъп до променливата tutorialName.
  4. Накрая просто прикачваме нашата персонализирана директива "ng-guru" към нашия div таг.

Ако кодът се изпълни успешно, след стартиране на вашия код в браузъра ще се покаже следният изход.

Изход:

  • Горният изход ясно показва, че нашата персонализирана директива "ng-guru" използва променливата на обхвата tutorialName в родителския контролер.

Използване на контролери с директиви

Angular дава възможност за достъп до променливата-член на контролера директно от потребителски директиви, без да е необходим обектът на обхвата.

Това понякога става необходимо, тъй като в приложението може да имате множество обекти на обхват, принадлежащи на множество контролери.

Така че има голяма вероятност да допуснете грешка при достъп до обекта на обхват на грешен контролер.

В такъв сценарий има начин специално да се спомене думата „Искам да осъществя достъп до този специфичен контролер“ от моята директива.

Нека да разгледаме един пример за това как можем да постигнем това.

Event Registration

Guru99 Global Event

Обяснение на кода:

  1. Първо създаваме контролер, наречен "DemoController". В това ще дефинираме променлива, наречена "tutorialName" и този път вместо да я прикачим към обекта на обхвата, ще я прикачим директно към контролера.
  2. В нашата персонализирана директива ние специално споменаваме, че искаме да използваме контролера "DemoController", като използваме ключовата дума за параметър на контролера.
  3. Създаваме препратка към контролера, използвайки параметъра "controllerAs". Това се определя от Angular и е начинът да се препрати към контролера като референтен.

    Забележка: - Възможно е да се осъществи достъп до множество контролери в директива, като се посочат съответните блокове на контролера, контролерите и шаблоните.

  4. И накрая, в нашия шаблон използваме референцията, създадена в стъпка 3, и използваме променливата член, която беше прикрепена директно към контролера в стъпка 1.

Ако кодът се изпълни успешно, след стартиране на вашия код в браузъра ще се покаже следният изход.

Изход:

Резултатът ясно показва, че потребителската директива е особено достъпна до DemoController и прикрепената към нея променлива член tutorialName и показва текста "Angular".

Как да създадете директиви за многократна употреба

Вече видяхме силата на потребителските директиви, но можем да изведем това на следващото ниво, като изградим свои собствени повторно използваеми директиви.

Да кажем например, че искахме да инжектираме код, който винаги да показва долупосочените HTML тагове на множество екрани, което всъщност е само вход за "Името" и "възрастта" на потребителя.

За да използваме повторно тази функция на множество екрани, без да кодираме всеки път, ние създаваме главна контрола или директива в ъгъл, за да задържим тези контроли („Име“ и „възраст“ на потребителя).

Така че сега, вместо да въвеждаме един и същ код за екрана по-долу всеки път, ние всъщност можем да вградим този код в директива и да вградим тази директива по всяко време.

Нека видим пример как можем да постигнем това.

Event Registration

Guru99 Global Event

Обяснение на кода:

  1. В нашия кодов фрагмент за персонализирана директива това, което се променя, е само стойността, която се дава на параметъра на шаблона на нашата персонализирана директива.

    Вместо таг или текст от план пет, ние всъщност въвеждаме целия фрагмент от 2 контрола за въвеждане за „Име“ и „възраст“, ​​които трябва да бъдат показани на нашата страница.

Ако кодът се изпълни успешно, след стартиране на вашия код в браузъра ще се покаже следният изход.

Изход:

От горния изход можем да видим, че кодовият фрагмент от шаблона на потребителската директива се добавя към страницата.

Директиви и компоненти на AngularJS - ng-transclude

Както споменахме доста по-рано, Angular има за цел да разшири функционалността на HTML. И вече видяхме как можем да инжектираме код, като използваме потребителски директиви за повторна употреба.

Но в съвременното разработване на уеб приложения има и концепция за разработване на уеб компоненти. Което по същество означава създаване на собствени HTML маркери, които могат да се използват като компоненти в нашия код.

Следователно angular предоставя друго ниво на мощност за разширяване на HTML таговете, като дава възможност за инжектиране на атрибути в самите HTML тагове.

Това се прави от маркера " ng-transclude ", който е вид настройка, за да се каже на ъглово да улови всичко, което е поставено в директивата в маркировката.

Нека вземем пример как можем да постигнем това.

Event Registration

Guru99 Global Event

Angular JS

Обяснение на кода:

  1. Използваме директивата, за да дефинираме персонализиран HTML таг, наречен 'pane' и добавяме функция, която ще добави някакъв персонализиран код за този маркер. В изхода нашият персонализиран таг за панел ще покаже текста "AngularJS" в правоъгълник с плътна черна граница.
  2. Атрибутът "transclude" трябва да бъде посочен като true, което се изисква от angular за инжектиране на този маркер в нашия DOM.
  3. В обхвата определяме атрибут на заглавието. Атрибутите обикновено се дефинират като двойки име / стойност като: name = "value". В нашия случай името на атрибута в нашия HTML етикет на панела е „заглавие“. Символът "@" е изискването от ъглово. Това се прави така, че когато в стъпка 5 се изпълни заглавието на реда = {{заглавие}}, персонализираният код за атрибута на заглавието се добавя към HTML маркера на панела.
  4. Персонализираният код за атрибутите на заглавието, който просто очертава плътна черна граница за нашия контрол.
  5. И накрая, извикваме нашия потребителски HTML таг заедно с атрибута заглавие, който беше дефиниран.

Ако кодът се изпълни успешно, след стартиране на вашия код в браузъра ще се покаже следният изход.

Изход:

  • Резултатът ясно показва, че атрибутът на заглавието на етикета html5 на панела е зададен на персонализирана стойност на "Angular.JS".

Вложени директиви

Директивите в ъглови могат да бъдат вложени. Подобно на вътрешните модули или функции на всеки език за програмиране, може да се наложи да вградите директиви една в друга.

Можете да разберете по-добре това, като видите следния пример.

В този пример създаваме 2 директиви, наречени "външен" и "вътрешен".

  • Вътрешната директива показва текст, наречен "Inner".
  • Докато външната директива всъщност извиква вътрешната директива, за да покаже текста, наречен "Inner".


Guru99 Global Event

Обяснение на кода:

  1. Ние създаваме директива, наречена "външна", която ще се държи като нашата родителска директива. След това тази директива ще извика директивата "вътрешна".
  2. Ограничението: „E“ се изисква от angular, за да се гарантира, че данните от вътрешната директива са достъпни за външната директива. Буквата „Е“ е кратката форма на думата „Елемент“.
  3. Тук създаваме вътрешната директива, която показва текста "Inner" в div таг.
  4. В шаблона за външната директива (стъпка # 4) извикваме вътрешната директива. Така че тук инжектираме шаблона от вътрешната директива към външната директива.
  5. И накрая, ние директно извикваме външната директива.

Ако кодът се изпълни успешно, след стартиране на вашия код в браузъра ще се покаже следният изход.

Изход:

От изхода,

  • Вижда се, че са извикани както външната, така и вътрешната директива и се показва текстът и в двата тагове div.

Обработка на събития в директива

Събития като кликвания на мишката или щраквания върху бутони могат да се обработват от самата директива. Това се прави с помощта на функцията за връзка. Функцията за връзка е това, което позволява директивата да се прикачи към DOM елементите в HTML страница.

Синтаксис:

Синтаксисът на елемента link е както е показано по-долу

ng-повторение

link: function ($scope, element, attrs)

Функцията за връзка обикновено приема 3 параметъра, включително обхвата, елемента, с който е свързана директивата, и атрибутите на целевия елемент.

Нека разгледаме пример за това как можем да постигнем това.

Event Registration

Guru99 Global Event

Click Me

Обяснение на кода:

  1. Използваме функцията за връзка, както е дефинирана в angular, за да дадем възможност на директивите за достъп до събития в HTML DOM.
  2. Използваме ключовата дума 'element', защото искаме да отговорим на събитие за HTML DOM елемент, който в нашия случай ще бъде елементът "div". След това използваме функцията "bind" и казваме, че искаме да добавим персонализирана функционалност към клик събитието на елемента. Думата „щракване“ е ключовата дума, която се използва за означаване на събитието за щракване на който и да е HTML контрол. Например контролата за бутон HTML има събитие за щракване. Тъй като в нашия пример искаме да добавим персонализиран код към клик събитието на нашия таг „dev“, използваме ключовата дума „click“.
  3. Тук казваме, че искаме да заместим вътрешния HTML на елемента (в нашия случай div елемента) с текста „Ти ме кликна!“.
  4. Тук дефинираме нашия div таг, за да използваме ng-guru потребителската директива.

Ако кодът се изпълни успешно, след стартиране на вашия код в браузъра ще се покаже следният изход.

Изход:

  • Първоначално текстът „Щракнете върху мен“ ще бъде показан на потребителя, защото това е първоначално дефинираното в div тага. Когато действително щракнете върху тага div, ще се покаже изходът по-долу

Обобщение

  • Може да се създаде и персонализирана директива, която може да се използва за инжектиране на код в основното ъглово приложение.
  • Потребителски директиви могат да бъдат извикани членове, дефинирани в обекта на обхвата в определен контролер, като се използват ключовите думи 'Controller', 'controllerAs' и 'template'.
  • Директивите също могат да бъдат вложени, за да предоставят вградена функционалност, която може да се изисква в зависимост от необходимостта на приложението.
  • Директивите могат да бъдат направени повторно използваеми, така че да могат да се използват за инжектиране на общ код, който може да се изисква в различни уеб приложения.
  • Директивите могат да се използват и за създаване на персонализирани HTML тагове, които биха имали собствена функционалност, дефинирана според бизнес изискванията.
  • Събитията могат да се обработват и от директивите, за да се справят с DOM събития като кликвания върху бутони и мишки.