AngularJS egyéni direktíva: Sablonok, hatókör és átfedés

⚡ Okos összefoglaló

Az AngularJS egyéni direktívái a HTML-t olyan újrafelhasználható viselkedéssel bővítik, amelyet Ön határoz meg. Egy direktívagyár egy definíciós objektumot ad vissza, és az AngularJS ezt a viselkedést csatolja a megfelelő elemhez, attribútumhoz, osztályhoz vagy megjegyzéshez a jelölőnyelvben.

  • 🏗️ Bejegyzés: A module.directive metódus egy normalizált nevet, valamint egy factory függvényt fogad el, amely visszaadja a direktíva definíciós objektumát.
  • 🔤 Elnevezés: A nevek teveCase-ban vannak JavaSzkript és kebab-eset HTML-en belül, így ngGuru az oldalon ng-guruként van írva.
  • 🎯 Megfelelő: A restrict tulajdonság dönti el, hogy az AngularJS illeszkedik-e egy elemre, attribútumra, osztályra vagy megjegyzésre, és alapértelmezés szerint az EA-t használja.
  • 🧬 Hozzáférés hatóköréhez: Egy direktíva alapértelmezés szerint megosztja a szülő hatókört, míg a scope opció egy izolált hatókört épít fel @, =, & vagy < kötésekkel.
  • 🔗 Link funkció: A link függvény hatókört, elemet és attribútumokat kap, és ez a megfelelő hely a DOM-figyelőknek és a tisztításnak.
  • 🧱 Összetétel: Az irányelvek egymásba ágyazódnak, tetszőleges jelölőnyelvet csomagolnak transzklúzióval, és egy vezérlőn keresztül teszik elérhetővé az API-t a testvérek számára.
  • ⚠️ Támogatási állapot: Az AngularJS 2021. december 31-én elérte az élettartama végét, és további javításokat vagy biztonsági javításokat nem kap.

Egyéni utasítások az AngularJS-ben

Mi az a Custom Directive az AngularJS-ben?

A Egyéni irányelv az AngularJS-ben egy felhasználó által definiált direktíva, amely a HTML-t a felhasználó által írt viselkedéssel bővíti. Egy modul a „direktive” függvény használatával, és az AngularJS hozzáfűzi azt az oldal minden olyan pontjához, ahol a megfelelő elem vagy attribútum megjelenik. Annak ellenére, hogy az AngularJS sok hatékony beépített direktívák a dobozból kivéve, például ng-ismétlés, néha egyéni utasításokra van szükség.

⚠️ Javítás: Az eredeti szerint egy egyéni direktíva „lecseréli azt az elemet, amelyhez használják”. Alapértelmezés szerint nem: template beillesztésre kerül belső az illeszkedő elem. Csere szükséges replace: true, elavult az AngularJS 1.3 óta.

⚠️ Támogatási közlemény: AngularJS elérve élettartam vége 2021. december 31-én és nem kap további javításokat vagy biztonsági javításokat. Az alábbiakban leírtak továbbra is pontosak maradnak a meglévő AngularJS 1.x kód fenntartása érdekében; a modern Angularban a megfelelőik a komponensek és az attribútumdirektívák.

Az egyéni direktívák használatának oka az ismétlődés. Amikor ugyanaz a jelölés vagy DOM-kapcsolat több képernyőn is megjelenik, egy direktíva egyetlen elnevezett címkévé alakítja azt.

Hogyan készítsünk egyedi irányelvet?

Nézzünk egy példát arra, hogyan hozhatunk létre egy AngularJS egyéni direktívát.

A mi esetünkben az egyéni direktíva egyszerűen egy div taget fog beilleszteni az oldalunkba, amelynek szövege az „Angular JS Tutorial” lesz, amikor a direktívát meghívjuk.

Az alábbi, jegyzetekkel ellátott képernyőképen számozással látható a lista négy, utána elmagyarázott része.

Hozzon létre egyéni irányelvet

<!DOCTYPE html>
<html>
<head>
    <meta chrset="UTF 8">
    <title>Event Registration</title>
</head>
<body>

<script src="https://code.angularjs.org/1.6.9/angular-route.js"></script>
<script src="https://code.angularjs.org/1.6.9/angular.js"></script>
<script src="https://code.angularjs.org/1.6.9/angular.min.js"></script>
<script src="https://code.jquery.com/jquery-3.3.1.min.js"></script>

<h1> Guru99 Global Event</h1>

<div ng-app="DemoApp">
    <div ng-guru=""></div>

</div>

<script type="text/javascript">
    var app = angular.module('DemoApp',[]);
    app.directive('ngGuru',function(){

    return {
        template: '<div>Angular JS Tutorial</div>'
    }
    });

</script>

</body>
</html>

⚠️ Figyelem – a listában megőrzött hibák: A kód pontosan úgy kerül reprodukálásra, ahogyan közzétették. Három hiba ismétlődik minden itt felsorolt ​​listában: chrset="UTF 8" kell lennie charset="UTF-8"; angular.js és a angular.min.js mindkettő betöltődik, tehát az AngularJS kétszer töltődik be; és angular-route.js betöltődik, mielőtt az a fájl betöltődik, amelytől függ.

Code Magyarázat

  1. Először létrehozunk a modul az AngularJS alkalmazásunkhoz. Erre szükség van egy egyéni direktíva létrehozásához, mivel az direktíva ezzel a modullal lesz létrehozva.
  2. Most létrehozunk egy „ng” nevű egyéni direktívát.Guru” és egy gyári függvény definiálása, amely az irányelvünkhöz tartozó egyéni kódot fogja tárolni.
  3. A template paramétert használjuk, ami egy AngularJS által definiált paraméter egyéni direktívákhoz. Ebben azt definiáljuk, hogy amikor ezt az direktívát használjuk, akkor csak a template értékét használjuk, és illesszük be a hívó kódba.
  4. Itt most az általunk létrehozott „ng-guru” direktívát használjuk. Amikor ezt tesszük, a sablonunkhoz definiált érték, <div>Angular JS Tutorial</div>, most ide lesz befecskendezve.

Irányelv elnevezése és normalizálása

A névbeli eltérés a következők között: JavaA szkriptek és a HTML összezavarják a legtöbb kezdőt. AngularJS normalizálódik minden elem és attribútumnév egyezése előtt: eltávolítja azokat x- or data- előtagot, majd egy által határolt nevet konvertál -, : or _ a camelCase-be. Ezért ngGuru gyufa ng-guru, és miért data-ng-guru is működik. A camelCase forma a valódi neve; a kebab-case egyszerűen így van leírva HTML-ben.

⚠️ Javítás: Az eredeti szöveg szerint az egyéni direktíva nevének „az 'ng' betűkkel kell kezdődnie”. hivatalos AngularJS dokumentáció az ellenkezőjét tanácsolja: soha ne illessze be a saját utasításai elé ng, különben ütközhetnek egy jövőbeli beépített elemmel. Használjon saját előtagot, például g99Guru írva, mint g99-guru.

Ha a kód sikeresen végrehajtódik, ez a kimenet jelenik meg.

output:

Hozzon létre egyéni irányelvet

A kimenet egyértelműen mutatja, hogy az egyéni ng-guru direktívánk, amelyhez az egyéni szöveg megjelenítésére szolgáló sablon van definiálva, megjelenik a böngészőben. A következő lépés, hogy valami újrafelhasználásra érdemes elemet tegyünk a sablonba.

Hogyan hozzunk létre újrafelhasználható direktívákat

Már láttuk az egyéni direktívák erejét, de ezt a következő szintre emelhetjük saját újrafelhasználható direktíváink elkészítésével.

Tegyük fel például, hogy olyan kódot szeretnénk beilleszteni, amely mindig, több képernyőn is megjeleníti az alábbi HTML-címkéket, ami alapvetően csak a felhasználó „nevének” és „életkorának” a bemenete.

Hozzon létre újrafelhasználható irányelveket

Ahhoz, hogy ezt a részletet több képernyőn is újra felhasználhassuk anélkül, hogy minden alkalommal kódolnánk, létrehozunk egy master vezérlőt, vagy direktívát az AngularJS-ben, amely ezt a két vezérlőt tartalmazza.

Tehát ahelyett, hogy minden képernyőn megismételnénk ezt a jelölést, beágyazzuk egy direktívába, és ehelyett meghívjuk az direktívát. Az alábbi képernyőkép az egyetlen sort jelöli, amely megváltozik.

Hozzon létre újrafelhasználható irányelveket

<!DOCTYPE html>
<html>
<head>
    <meta chrset="UTF 8">
    <title>Event Registration</title>
</head>
<body>

<script src="https://code.angularjs.org/1.6.9/angular-route.js"></script>
<script src="https://code.angularjs.org/1.6.9/angular.js"></script>
<script src="https://code.angularjs.org/1.6.9/angular.min.js"></script>
<script src="https://code.jquery.com/jquery-3.3.1.min.js"></script>

<h1> Guru99 Global Event</h1>

<div ng-app="DemoApp">
    <div ng-guru=""></div>

</div>

<script type="text/javascript">

    var app = angular.module('DemoApp',[]);

    app.directive('ngGuru',function(){
        return {

            template: '&nbsp;&nbsp;Name <input type="text"><br><br>&nbsp;&nbsp;&nbsp;Age<input type="text">'
        };
    });

</script>

</body>
</html>

Code Magyarázat

  • Az egyéni direktívához tartozó kódrészletünkben csak a sablonparaméternek adott érték változik. Egy sima címke vagy egy sornyi szöveg helyett a „Név” és a „Kor” két bemeneti vezérlőelemének teljes részletét adjuk meg, amelyeket az oldalunkon meg kell jeleníteni.

👍 Tipp: Egy ilyen hosszú sablonnak külön fájlban a helye. Csere template mert templateUrl: 'name-age.html'.

Ha a kód sikeresen végrehajtódik, ez a kimenet jelenik meg.

output:

Hozzon létre újrafelhasználható irányelveket

A fenti kimenetből láthatjuk, hogy az egyéni direktíva sablonjából származó kódrészlet hozzáadódik az oldalhoz. A sablon továbbra is statikus, így a következő lépés az adatok betáplálása.

AngularJS direktívák és hatókörök

Az hatálya úgy definiálható, mint egy ragasztó, amely a vezérlőt a nézethez köti azáltal, hogy kezeli az adatokat a nézet és a vezérlő között.

Egyéni AngularJS direktívák létrehozásakor alapértelmezés szerint hozzáférésük lesz a szülővezérlőben található scope objektumhoz. Ez ugyanaz a scope objektum, nem egy másolat.

Ily módon az egyéni direktíva számára egyszerűvé válik a fő vezérlőnek átadott adatok felhasználása.

Nézzünk egy példát arra, hogyan használhatjuk egy szülő vezérlő hatókörét az egyéni direktívánkban. Az alábbi képernyőképen számozva látható a négy lépés.

AngularJS direktívák és hatókörök

<!DOCTYPE html>
<html>
<head>
    <meta chrset="UTF 8">
    <title>Event Registration</title>
</head>
<body>

<script src="https://code.angularjs.org/1.6.9/angular-route.js"></script>
<script src="https://code.angularjs.org/1.6.9/angular.js"></script>
<script src="https://code.angularjs.org/1.6.9/angular.min.js"></script>
<script src="https://code.jquery.com/jquery-3.3.1.min.js"></script>

<h1> Guru99 Global Event</h1>

<div ng-app="DemoApp" ng-controller="DemoController">
    <div ng-guru=""></div>

</div>

<script type="text/javascript">

    var app = angular.module('DemoApp',[]);

    app.controller('DemoController',function($scope) {
        $scope.tutorialName = "Angular JS";

    });

        app.directive('ngGuru',function(){
        return {
         template: '<div>{{tutorialName}}</div>'
     }
    });

</script>

</body>
</html>

Code Magyarázat

  1. Először létrehozunk egy „DemoController” nevű vezérlőt. Ebben definiálunk egy tutorialName nevű változót, és egyetlen utasítással csatoljuk a scope objektumhoz: $scope.tutorialName = "Angular JS".
  2. Egyéni direktívánkban a „tutorialName” változót egy kifejezés használatával hívhatjuk meg. Ez a változó elérhető lenne, mert a „DemoController” vezérlőben van definiálva, amely ennek az irányelvnek a szülője lesz.
  3. A vezérlőre hivatkozunk egy div címkében, amely szülő div címkénkként fog működni. Vegye figyelembe, hogy ezt először meg kell tenni annak érdekében, hogy egyéni direktívánk hozzáférjen a tutorialName változóhoz.
  4. Végül csak az egyéni „ng-guru” direktívánkat csatoljuk a div címkénkhoz.

Ha a kód sikeresen végrehajtódik, ez a kimenet jelenik meg.

output:

AngularJS direktívák és hatókörök

A fenti kimenet egyértelműen mutatja, hogy az „ng-guru” egyéni direktívánk a szülővezérlő tutorialName hatókör-változóját használja. A szülő hatókör megosztása kényelmes, de nem mindig az, amire szükségünk van.

Vezérlők használata direktívákkal

Az AngularJS lehetőséget ad arra, hogy közvetlenül az egyéni direktívákból érheti el a vezérlő tagváltozóját anélkül, hogy szükség lenne a hatókör objektumra.

Ez időnként azért válik szükségessé, mert egy alkalmazásnak több hatókör-objektuma is lehet, amelyek több vezérlőhöz tartoznak, így nagy az esélye annak, hogy véletlenül a rossz vezérlő hatókör-objektumához férünk hozzá.

Ilyen esetben van egy mód arra, hogy kifejezetten azt mondjuk ki az irányelvből, hogy „Hozzá akarok férni ehhez a vezérlőhöz”.

Nézzünk egy példát arra, hogyan érhetjük el ezt. A képernyőképen számozva látható a négy lépés.

Vezérlők használata direktívákkal

<!DOCTYPE html>
<html>
<head>
    <meta chrset="UTF 8">
    <title>Event Registration</title>
</head>
<body>

<script src="https://code.angularjs.org/1.6.9/angular-route.js"></script>
<script src="https://code.angularjs.org/1.6.9/angular.js"></script>
<script src="https://code.angularjs.org/1.6.9/angular.min.js"></script>
<script src="https://code.jquery.com/jquery-3.3.1.min.js"></script>

<h1> Guru99 Global Event</h1>

<div ng-app="DemoApp" ng-controller="DemoController">
    <div ng-guru99=""></div>

</div>

<script type="text/javascript">

    var app = angular.module('DemoApp',[]);

    app.controller('DemoController',function() {
        this.tutorialName = "Angular";

    });

     app.directive('ngGuru99',function(){
        return {
         controller: 'DemoController',

          controllerAs: 'ctrl',

          template: '{{ctrl.tutorialName}}'
     };
    });

</script>

</body>
</html>

Code Magyarázat

  1. Először létrehozunk egy „DemoController” nevű vezérlőt. Ebben definiálunk egy „tutorialName” nevű változót, és ezúttal a scope objektum helyett közvetlenül a vezérlőhöz csatoljuk.
  2. Egyéni direktívánkban külön megemlítjük, hogy a „DemoController” vezérlőt a vezérlőparaméter kulcsszó használatával szeretnénk használni.
  3. A „controllerAs” paraméterrel hozunk létre egy referenciát a vezérlőre. Ezt az AngularJS definiálja, és ez a módja annak, hogy egy alias segítségével hivatkozzunk a vezérlőre.
  4. Végül a sablonunkban a 3. lépésben létrehozott referenciát és az 1. lépésben közvetlenül a vezérlőhöz csatolt tagváltozót használjuk.

Jegyzet: Egy direktíván belül több vezérlő is elérhető a vezérlő, a controllerAs és a template utasítások megfelelő blokkjainak megadásával. Egy szülő direktíva vezérlőjét használd helyette require.

Ha a kód sikeresen végrehajtódik, ez a kimenet jelenik meg.

output:

Vezérlők használata direktívákkal

A kimenet egyértelműen mutatja, hogy az egyéni direktíva a DemoControllerhez és a hozzá csatolt tutorialName tagváltozóhoz fér hozzá, és az „Angular” szöveget jeleníti meg. Mindkét megközelítés továbbra is egy megosztott hatókörből olvas, amit egy izolált hatókör megakadályoz.

Hogyan különböznek a @, =, & és < kötések egy izolált hatókörben?

Egy olyan direktíva, amely megosztja a szülő hatókörét, vezérlőnként csak egyszer használható, mivel két példány ugyanazon változókért versengene. scope objektum létrehoz egy elkülönített hatókör: az utasítás a felsorolt ​​tulajdonságokon kívül semmi mást nem lát. Minden bejegyzés egy előtag szimbólumot használ, amely meghatározza, hogyan halad az értéke.

Szimbólum Irány Kapott érték Használja
@ Egyirányú belépés Az attribútum interpolált karakterláncként Címkék, címek, bármilyen egyszerű szöveg
= Kétirányú Maga az élő objektum vagy érték Modellek, amelyekre az irányelv visszaír
& Kimenő hívás Egy függvény, amely egy kifejezést értékel ki a külső hatókörben Visszahívások, például lezáráskor vagy mentéskor
< Egyirányú belépés A kiértékelt érték, soha nem felfelé írva Csak olvasható adatok, hozzáadva az AngularJS 1.5-ben

👍 Tipp: Elérni < előtt =Az egyirányú kötés olcsóbban figyelhető, és megakadályozza, hogy egy komponens csendben mutálja a hívó adatait. A következő szakasz a következőt használja: @.

AngularJS direktívák és komponensek: ng-transclude

Ahogy korábban említettük, az AngularJS célja a funkcionalitás kibővítése HTML. És már láttuk, hogyan lehet kódbefecskendezést végezni egyéni újrafelhasználható direktívák használatával.

De a modern webes alkalmazásfejlesztésben létezik a fejlesztés fogalma is.ping webkomponensek, ami alapvetően azt jelenti, hogy saját HTML-címkéket hozunk létre, amelyeket komponensként használhatunk a kódunkban.

Ezért az AngularJS egy újabb szintű teljesítményt nyújt a HTML-címkék kiterjesztéséhez azáltal, hogy lehetővé teszi a hívó által a címkébe helyezett jelölőnyelv becsomagolását.

Ezt a „ng-transclude” direktíva, amely arra utasítja az AngularJS-t, hogy rögzítse a jelölésben az egyéni címkén belüli összes elemet, és ezen a ponton helyezze el a sablonban.

Vegyünk egy példát arra, hogyan érhetjük el ezt. A képernyőképen az alábbi öt pontot számoztuk meg.

AngularJS irányelvek és összetevők

<!DOCTYPE html>
<html>
<head>
    <meta chrset="UTF 8">
    <title>Event Registration</title>
</head>
<body>

<script src="https://code.angularjs.org/1.6.9/angular-route.js"></script>
<script src="https://code.angularjs.org/1.6.9/angular.js"></script>
<script src="https://code.angularjs.org/1.6.9/angular.min.js"></script>
<script src="https://code.jquery.com/jquery-3.3.1.min.js"></script>

<h1> Guru99 Global Event</h1>

<div ng-app="DemoApp">
    <pane title="{{title}}">Angular JS</pane>

</div>

<script type="text/javascript">

    var app = angular.module('DemoApp',[]);

    app.directive('pane',function(){
        return {

            transclude:true,
            scope :{title:'@'},
            template: '<div style="border: 1px solid black;"> '+
                        '<ng-transclude></ng-transclude>'+
                            '</div>'
        };
    });

</script>

</body>
</html>

Code Magyarázat

  1. A direktívát egy „pane” nevű egyéni HTML tag definiálására használjuk, amelynek kódját egy factory függvény biztosítja. A kimenetben a pane tag az „Angular JS” szöveget jeleníti meg egy téglalapban, tömör fekete szegéllyel.
  2. A „transclude” tulajdonságot igazra kell állítani, ami azt jelenti az AngularJS-nek, hogy tartsa meg az eredeti belső jelölést, és tegye elérhetővé a következők számára: ng-transclude.
  3. A scope objektumban egy cím kötést deklarálunk. Az attribútumokat általában név/érték párokként írjuk le, például: name="value"Esetünkben a panelcímkén található attribútum a „title”, és a „@” szimbólum arra kéri az AngularJS-t, hogy ezt az attribútumot interpolált karakterláncként másolja át.
  4. A sablon megrajzolja a vezérlőelemünk tömör fekete szegélyét, és megjelöli azt a helyet, ahová a transzlokált jelölés beszúrásra kerül.
  5. Végül meghívjuk az egyéni HTML-címkénket a definiált title attribútummal együtt.

⚠️ Javítás: Az eredeti szöveg a „@” jelet az „Angular követelményeként” írta le. Ez nem formalitás: @ a fenti táblázatban szereplő négy izolált hatókörű kötési szimbólum egyike, és mindig karakterláncot eredményez. Ez a sablon soha nem jelenít meg {{title}}, és egyetlen vezérlő sem határozza meg title, így csak a beillesztett szöveg látható.

Ha a kód sikeresen végrehajtódik, ez a kimenet jelenik meg.

output:

AngularJS irányelvek és összetevők

  • A kimenet az egyéni panelelemet egy szegélyezett dobozként jeleníti meg, amely az átírt „Angular JS” szöveget tartalmazza.

Egy direktíva más direktívákat is tartalmazhat, amelyek a nagyobb komponensek összeszerelését írják le.

Beágyazott direktívák

Az AngularJS direktívái egymásba ágyazhatók. Mint bármely belső modulban vagy függvényben programozási nyelv, előfordulhat, hogy direktívákat kell egymásba ágyaznia.

Ezt jobban megértheti az alábbi példa megtekintésével.

Ebben a példában 2 „külső” és „belső” direktívát hozunk létre.

  • A belső direktíva egy „Belső” nevű szöveget jelenít meg.
  • Míg a külső direktíva valójában meghívja a belső direktívát, hogy megjelenítse a „Belső” nevű szöveget.

Az alábbi képernyőképen mindkét direktíva definíciója és az a pont látható, ahol az egyik meghívja a másikat.

Beágyazott direktívák

</head>
<body>

<script src="https://code.angularjs.org/1.6.9/angular-route.js"></script>
<script src="https://code.angularjs.org/1.6.9/angular.js"></script>
<script src="https://code.angularjs.org/1.6.9/angular.min.js"></script>
<script src="https://code.jquery.com/jquery-3.3.1.min.js"></script>

<h1> Guru99 Global Event</h1>

<div ng-app="DemoApp">
    <outer></outer>
</div>

<script type="text/javascript">

    var app = angular.module('DemoApp',[]);

    app.directive('outer',function(){
        return {

            restrict:'E',
            template: '<div><h1>Outer</h1><inner></inner></div>',
        }});

    app.directive('inner',function(){
        return {

            restrict:'E',
            template: '<div><h1>Inner</h1></div>',
        }
    });
</script>

</body>
</html>

⚠️ Figyelem – a hiba megmaradt ebben a listában: A közzétett lista ekkor kezdődik: </head>, hiányzik a nyitása <!DOCTYPE html>, <html> és a <head> sorokat. Add hozzá őket a futtatás előtt.

Code Magyarázat

  1. Létrehozunk egy „külső” direktívát, amely szülő direktívánkként fog viselkedni. Ez az irányelv ezután felhívja a „belső” irányelvet.
  2. Az restrict:'E' opció azt mondja az AngularJS-nek, hogy minden direktívához illeszkedjen elem név, ezért címkékként is írhatók <outer> és a <inner>Az „E” betű az „Element” szó rövidített alakja.
  3. Itt létrehozzuk a belső direktívát, amely az „Inner” szöveget jeleníti meg egy div címkében.
  4. A külső direktíva sablonjában meghívjuk a belső direktívát. Tehát itt a belső direktíva sablonját injektáljuk a külső direktívába.
  5. Végül pedig közvetlenül a külső irányelvre hivatkozunk.

⚠️ Javítás: Az eredeti szöveg állítólag restrict:'E' szükséges „annak biztosításához, hogy a belső direktívából származó adatok elérhetők legyenek a külső direktíva számára”. Nem tesz ilyet; csak szabályozza hogyan Egy direktíva írható. A beágyazás azért működik, mert a fordító folyamatosan abba a sablonba lép be, amit éppen beszúrt. Az adatok megosztásához használd a require és a controller.

Ha a kód sikeresen végrehajtódik, ez a kimenet jelenik meg.

output:

Beágyazott direktívák

A kimenetből,

  • Látható, hogy mind a külső, mind a belső direktíva meghívásra került, és mindkét div tagben található szöveg megjelenik.

A jelölés megjelenítése csak a direktíva működésének a fele; a másik fele a felhasználóra való reagálás.

Események kezelése egy direktívában

Események Az egérkattintások vagy a gombokra kattintások magukon a direktívákon belül is kezelhetők. Ez a link függvény segítségével történik. A link függvény teszi lehetővé az direktíva számára, hogy csatolja magát a HTML oldal DOM elemeihez.

Syntax:

A link függvény szintaxisa az alábbiak szerint alakul.

link: function ($scope, element, attrs)

A link függvény általában 3 paramétert fogad el: a hatókört, az elemet, amelyhez az irányelv tartozik, és a cél elem attribútumait. További kettő, egy kötelező vezérlő és egy transclude függvény, akkor érkezik, amikor ezek érvényesek.

Fordítási fázis vs. link fázis

Az AngularJS két menetben dolgozza fel az utasításokat, és ha tudod, melyik melyik, akkor a kódod hova tartozik.

  • Összeállít egyszer fut le a template elemen, mielőtt bármilyen hatókör létrejönne. Illeszkedik a minden klón által megosztott strukturális szerkesztésekhez.
  • Link példányonként egyszer fut le, a sablon klónozása és egy hatókör csatolása után. A DOM-figyelők és a hatókör-olvasások ide tartoznak.

Mivel a compile-nak nincs hatóköre, minden, ami adatot igényel, a linkhez tartozik, ezért definiálja az alábbi példa link egyedül.

Nézzünk egy példát arra, hogyan érhetjük ezt el. A képernyőképen az alábbi négy pont számozása látható.

Az események kezelése direktívában

<!DOCTYPE html>
<html>
<head>
    <meta chrset="UTF 8">
    <title>Event Registration</title>
</head>
<body>

<script src="https://code.angularjs.org/1.6.9/angular-route.js"></script>
<script src="https://code.angularjs.org/1.6.9/angular.js"></script>
<script src="https://code.angularjs.org/1.6.9/angular.min.js"></script>
<script src="https://code.jquery.com/jquery-3.3.1.min.js"></script>

<h1> Guru99 Global Event</h1>

<div ng-app="DemoApp">
    <div ng-guru="">Click Me</div>
</div>

<script type="text/javascript">

    var app = angular.module('DemoApp',[]);

    app.directive('ngGuru',function(){
        return {

            link:function($scope,element,attrs) {
                element.bind('click',function () {
                    element.html('You clicked me');
                });}
        }});
</script>

</body>
</html>

Code Magyarázat

  1. Az AngularJS-ben definiált link függvényt használjuk, hogy a direktíva hozzáférhessen a HTML DOM eseményeihez.
  2. Az „element” kulcsszót azért használjuk, mert egy HTML DOM elem eseményére szeretnénk válaszolni, ami esetünkben a „div” elem. Ezután a „bind” függvényt használjuk egyéni funkciók hozzáadásához az elem click eseményéhez. A „click” szó az a kulcsszó, amely bármely HTML vezérlő click eseményét jelöli.
  3. Itt azt mondjuk, hogy az elem belső HTML-kódját, esetünkben a div elemet, a „Rám kattintottál” szöveggel szeretnénk helyettesíteni.
  4. Itt definiáljuk a div címkénket az ng-guru egyéni direktíva használatához.

👍 Tipp: Egy direktívának ki kell takarítania önmagát követően. Távolítson el minden olyan figyelőt, amely túléli a benne lévő elemet. element.on('$destroy', ...), vagy az oldal memóriaszivárgást okoz.

Ha a kód sikeresen végrehajtódik, ez a kimenet jelenik meg.

output:

Az események kezelése direktívában

  • Kezdetben a „Kattints rám” szöveg jelenik meg a felhasználónak, mivel ezt definiálták a div címkében. Amikor a div címkére kattintasz, az alábbi kimenet jelenik meg.

Az események kezelése direktívában

A fenti példák mindegyike ugyanazon definíciós objektum egy vagy két tulajdonságát használta. A teljes halmazt érdemes megtartani.ping kézhez.

Irányelv Definíciója Objektum Tulajdonságok Referencia

Egy direktívagyár által visszaadott objektum a Irányelv Definíciós ObjektumMinden tulajdonság egy kérdésre ad választ az utasítás viselkedésével kapcsolatban.

Ingatlanok alapértelmezett Mit csinál
korlátoz 'EA' Mely űrlapok illeszkednek: E elem, A attribútum, C osztály, M megjegyzés
sablon egyik sem Beágyazott jelölés beszúrva az egyező elembe
sablonUrl egyik sem Sablonfájl elérési útja, egyszer lekérve, majd gyorsítótárazva
hatálya hamis A „hamis” megosztja a szülő hatókörét, az „igaz” gyermeket hoz létre, az objektum pedig izolálódik.
ellenőr egyik sem A konstruktor, amely egy API-t tesz elérhetővé, más direktívákhoz is szükséges lehet
vezérlőAs egyik sem A sablonon belüli vezérlő aliasa
szükség egyik sem Egy másik direktíva vezérlője a befecskendezéshez; ^ szülőket keres, ^^ kihagyja önmagát, ? opcionális
link egyik sem Példányonkénti függvény: scope, element, attrs, controller, transcludeFn
összeállít egyik sem Egyszer fut le a sablonon, mielőtt bármilyen hatókör létrejönne
átszúrás hamis Megőrzi az eredeti belső jelölést az ng-transclude számára
prioritás 0 Fordítsd le a sorrendet egy megosztott elemen; a magasabb szintű elemek futnak először
terminál hamis Leállítja az alacsonyabb prioritású utasításokat az adott elemen
cserélni hamis Lecseréli az elemet a sablonra. Elavult az 1.3 verzió óta.

👍 Tipp: Kezdj restrict, template és a link, hozzáad scope újrafelhasználásra, controller és a require direktíva-direktíva hívásokhoz, és hagyja priority és a terminal egyedül.

GYIK

Az AngularJS 1.5-ben hozzáadott komponens egy direktíva véleményen alapuló alapértelmezett értékekkel: csak elemegyeztetés, izolált hatókör és vezérlő. Használj komponenst önálló nézethez, direktívát pedig linkszintű DOM-hozzáféréshez.

A név általában nem normalizálódott helyesen, vagy a restrict kizárja a használt űrlapot. Egy my néven regisztrált direktívaBox egyezik a my-box értékkel, nem a mybox értékkel, és egy elemcímkének tartalmaznia kell az E értéket.

Igen. AI Az asszisztensek egy izolált hatókört képeznek le bemeneti és kimeneti dekorátorokra, valamint egy sablont egy komponens sablonra. RevVizsgáld meg a transzklúziós és linkfüggvényes DOM kódot kézzel, mivel ezek ritkán fordítódnak le tisztán.

MI asszisztensek generálnak egységteszt vázlatok, amelyek lefordítják az irányelvet, hozzárendelnek egy hatókört, és a renderelt kimenetre vonatkozóan érvényesítik az állításokat. Jól tudnak listázni a szélső eseteket, ezért a generált állításokat kiinduló vázlatként kell kezelni.

Használd a templateUrl függvényt, ha a jelölőnyelv egy-két soron túlnő. A fájl szerkeszthető normál HTML eszközökkel, és csak egyszer kerül lekérésre, majd minden későbbi példányhoz a sablon gyorsítótárából kerül kiszolgálásra.

Foglald össze ezt a bejegyzést a következőképpen: