CUSTOM-direktiver i AngularJS: Hvordan lage? [Eksempler]
Hva er tilpasset direktiv?
A Tilpasset direktiv i AngularJS er et brukerdefinert direktiv som gir brukere mulighet til รฅ bruke รธnskede funksjoner for รฅ utvide HTML-funksjonaliteten. Den kan defineres ved รฅ bruke "direktiv"-funksjonen, og den erstatter elementet den brukes til. Selv om AngularJS har mange kraftige direktiver ut av esken, kreves det noen ganger tilpassede direktiver.
Hvordan lage et tilpasset direktiv?
La oss ta en titt pรฅ et eksempel pรฅ hvordan vi kan lage et tilpasset AngularJS-direktiv.
Det tilpassede direktivet i vรฅrt tilfelle kommer ganske enkelt til รฅ injisere en div-tag som har teksten "AngularJS Tutorial" pรฅ siden vรฅr nรฅr direktivet kalles.
<!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>
Kode Forklaring
- Vi lager fรธrst en moduler for vรฅr vinkelapplikasjon. Dette er nรธdvendig for รฅ lage et tilpasset direktiv fordi direktivet vil bli opprettet ved hjelp av denne modulen.
- Vi lager nรฅ et tilpasset direktiv kalt "ngGuru" og definerer en funksjon som vil ha tilpasset kode for vรฅrt direktiv.Merk: - Merk at nรฅr vi definerer direktivet, har vi definert det som ngGuru med bokstaven 'G' som stor. Og nรฅr vi fรฅr tilgang til det fra vรฅr div-tag som et direktiv, fรฅr vi tilgang til det som ng-guru. Dette er hvordan angular forstรฅr tilpassede direktiver definert i en applikasjon. Fรธrst bรธr navnet pรฅ det tilpassede direktivet starte med bokstavene 'ng'. For det andre skal bindestreksymbolet '-' bare nevnes nรฅr direktivet kalles. Og for det tredje kan den fรธrste bokstaven etter bokstavene 'ng' nรฅr direktivet defineres enten vรฆre smรฅ eller store.
- Vi bruker malparameteren som er en parameter definert av Angular for tilpassede direktiver. I dette definerer vi at nรฅr dette direktivet brukes, sรฅ bare bruk verdien av malen og injiser den i anropskoden.
- Her bruker vi nรฅ vรฅrt spesiallagde "ng-guru"-direktiv. Nรฅr vi gjรธr dette, vil verdien vi definerte for malen vรฅr " Angular JS veiledning โ vil nรฅ bli injisert her.
Hvis koden utfรธres vellykket, vil fรธlgende utdata vises nรฅr du kjรธrer koden i nettleseren.
Utgang:
Utdataene ovenfor viser tydelig at vรฅrt tilpassede ng-guru-direktiv, som har malen definert for รฅ vise en tilpasset tekst, vises i nettleseren.
AngularJs direktiver og omfang
Omfanget er definert som limet som binder kontrolleren til visningen ved รฅ administrere dataene mellom visningen og kontrolleren.
Nรฅr du oppretter tilpassede AngularJs-direktiver, vil de som standard ha tilgang til scope-objektet i den overordnede kontrolleren.
Pรฅ denne mรฅten blir det enkelt for spesialdirektivet รฅ gjรธre bruk av dataene som sendes til hovedkontrollรธren.
La oss se pรฅ et AngularJS tilpasset direktiv eksempel pรฅ hvordan vi kan bruke omfanget til en overordnet kontroller i vรฅrt tilpassede direktiv.
<!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>
Kode Forklaring
- Vi lager fรธrst en kontroller kalt "DemoController". I dette definerer vi en variabel kalt tutorialName og fester den til scope-objektet i en setning โ $scope.tutorialName = โAngularJSโ.
- I vรฅrt tilpassede direktiv kan vi kalle variabelen "tutorialName" ved รฅ bruke et uttrykk. Denne variabelen vil vรฆre tilgjengelig fordi den er definert i kontrolleren "DemoController", som vil bli overordnet for dette direktivet.
- Vi refererer til kontrolleren i en div-tag, som vil fungere som vรฅr overordnede div-tag. Merk at dette mรฅ gjรธres fรธrst for at vรฅrt egendefinerte direktiv skal fรฅ tilgang til tutorialName-variabelen.
- Vi legger til slutt bare vรฅrt tilpassede direktiv "ng-guru" til div-taggen vรฅr.
Hvis koden utfรธres vellykket, vil fรธlgende utdata vises nรฅr du kjรธrer koden i nettleseren.
Utgang:
Ovennevnte utdata viser tydelig at vรฅrt tilpassede direktiv "ng-guru" bruker omfangsvariabelen tutorialName i foreldrekontrolleren.
Bruke kontrollere med direktiver
Angular gir anlegget til fรฅ tilgang til kontrollerens medlemsvariabel direkte fra tilpassede direktiver uten behov for omfangsobjektet.
Dette blir nรธdvendig til tider fordi du i en applikasjon kan ha flere scope-objekter som tilhรธrer flere kontrollere.
Sรฅ det er stor sjanse for at du kan gjรธre feilen med รฅ fรฅ tilgang til scope-objektet til feil kontroller.
I slike scenarier er det en mรฅte รฅ spesifikt nevne รฅ si "Jeg vil ha tilgang til denne spesifikke kontrolleren" fra direktivet mitt.
La oss ta en titt pรฅ et eksempel pรฅ hvordan vi kan oppnรฅ dette.
<!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>
Kode Forklaring
- Vi lager fรธrst en kontroller kalt "DemoController". I dette vil vi definere en variabel kalt "tutorialName", og denne gangen i stedet for รฅ knytte den til scope-objektet, vil vi knytte den direkte til kontrolleren.
- I vรฅrt tilpassede direktiv nevner vi spesifikt at vi รธnsker รฅ bruke kontrolleren "DemoController" ved รฅ bruke nรธkkelordet for kontrollerparameter.
- Vi oppretter en referanse til kontrolleren ved รฅ bruke parameteren "controllerAs". Dette er definert av Angular og er mรฅten รฅ referere kontrolleren som en referanse.
- Til slutt, i malen vรฅr, bruker vi referansen opprettet i trinn 3 og bruker medlemsvariabelen som ble koblet direkte til kontrolleren i trinn 1.
Merk: -Det er mulig รฅ fรฅ tilgang til flere kontrollere i et direktiv ved รฅ spesifisere respektive blokker av kontrolleren, controllerAs og malsetninger.
Hvis koden utfรธres vellykket, vil fรธlgende utdata vises nรฅr du kjรธrer koden i nettleseren.
Utgang:
Utdataene viser tydelig at det tilpassede direktivet spesielt har tilgang til DemoController og medlemsvariabelen tutorialName som er knyttet til den, og viser teksten "Angular".
Hvordan lage gjenbrukbare direktiver
Vi har allerede sett kraften i tilpassede direktiver, men vi kan ta det til neste nivรฅ ved รฅ bygge vรฅre egne gjenbrukbare direktiver.
La oss for eksempel si at vi รธnsket รฅ injisere kode som alltid ville vise HTML-taggene nedenfor pรฅ tvers av flere skjermer, som i utgangspunktet bare er en inngang for "navnet" og "alderen" til brukeren.
For รฅ gjenbruke denne funksjonen pรฅ flere skjermer uten koding hver gang, lager vi en hovedkontroll eller et direktiv i vinkel for รฅ holde disse kontrollene ("navn" og "alder" til brukeren).
Sรฅ nรฅ, i stedet for รฅ skrive inn den samme koden for skjermen nedenfor hver gang, kan vi faktisk legge inn denne koden i et direktiv og legge inn det direktivet nรฅr som helst.
La oss se et eksempel pรฅ hvordan vi kan oppnรฅ dette.
<!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: ' Name <input type="text"><br><br> Age<input type="text">'
};
});
</script>
</body>
</html>
Kode Forklaring
- I kodebiten vรฅr for et tilpasset direktiv er det som endres bare verdien som er gitt til malparameteren i det tilpassede direktivet. I stedet for en plan fem-tag eller tekst, legger vi faktisk inn hele fragmentet av 2 inngangskontroller for " Navn" og "alder" som mรฅ vises pรฅ siden vรฅr.
Hvis koden utfรธres vellykket, vil fรธlgende utdata vises nรฅr du kjรธrer koden i nettleseren.
Utgang:
Fra utdataene ovenfor kan vi se at kodebiten fra malen til det tilpassede direktivet blir lagt til siden.
AngularJS-direktiver og komponenter โ ng-transclude
Som vi nevnte ganske tidligere, er Angular ment รฅ utvide funksjonaliteten til HTML. Og vi har allerede sett hvordan vi kan ha kodeinjeksjon ved รฅ bruke tilpassede gjenbrukbare direktiver.
Men i moderne webapplikasjonsutvikling er det ogsรฅ et konsept med รฅ utvikle webkomponenter. Som i utgangspunktet betyr รฅ lage vรฅre egne HTML-tagger som kan brukes som komponenter i koden vรฅr.
Derfor gir angular et annet kraftnivรฅ til รฅ utvide HTML-tagger ved รฅ gi muligheten til รฅ injisere attributter i selve HTML-taggene.
Dette gjรธres av "ng-transkludereโ tag, som er en slags innstilling for รฅ fortelle angular รฅ fange opp alt som er satt inne i direktivet i markeringen.
La oss ta et eksempel pรฅ hvordan vi kan oppnรฅ dette.
<!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>
Kode Forklaring
- Vi bruker direktivet til รฅ definere en egendefinert HTML-tag kalt 'panel' og legger til en funksjon som vil sette inn en egendefinert kode for denne taggen. I utdataene kommer vรฅr egendefinerte rutekode til รฅ vise teksten "AngularJS" i et rektangel med en solid svart kant.
- "transclude"-attributtet mรฅ nevnes som sant, noe som kreves av angular for รฅ injisere denne taggen i DOM-en vรฅr.
- I omfanget definerer vi et tittelattributt. Attributter er normalt definert som navn/verdi-par som: navn=โverdiโ. I vรฅrt tilfelle er navnet pรฅ attributtet i HTML-koden for ruten vรฅr "tittel". "@"-symbolet er kravet fra vinkel. Dette gjรธres slik at nรฅr linjen title={{title}} kjรธres i trinn 5, blir den tilpassede koden for tittelattributtet lagt til i rutens HTML-tag.
- Den tilpassede koden for tittelattributtene som bare tegner en solid svart kant for vรฅr kontroll.
- Til slutt kaller vi vรฅr egendefinerte HTML-tag sammen med tittelattributtet som ble definert.
Hvis koden utfรธres vellykket, vil fรธlgende utdata vises nรฅr du kjรธrer koden i nettleseren.
Utgang:
- Utdataene viser tydelig at tittelattributtet til rutens html5-taggen er satt til den egendefinerte verdien "Angular.JS".
Nestede direktiver
Direktiver i AngularJS kan nestes. Som bare indre moduler eller funksjoner i noen programmeringssprรฅk, kan det hende du mรฅ bygge inn direktiver i hverandre.
Du kan fรฅ en bedre forstรฅelse av dette ved รฅ se eksemplet nedenfor.
I dette eksemplet lager vi 2 direktiver kalt "ytre" og "indre".
- Det indre direktivet viser en tekst kalt "Indre".
- Mens det ytre direktivet faktisk kaller det indre direktivet for รฅ vise teksten kalt "Indre".
</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>
Kode Forklaring
- Vi lager et direktiv kalt "ytre" som vil oppfรธre seg som vรฅrt overordnede direktiv. Dette direktivet vil da ringe til det "indre" direktivet.
- Begrensningen: 'E' kreves av vinkel for รฅ sikre at dataene fra det indre direktivet er tilgjengelige for det ytre direktivet. Bokstaven 'E' er den korte formen av ordet 'Element'.
- Her lager vi det indre direktivet som viser teksten "Inner" i en div-tag.
- I malen for det ytre direktivet (trinn #4) kaller vi det indre direktivet. Sรฅ her over injiserer vi malen fra det indre direktivet til det ytre direktivet.
- Til slutt kaller vi direkte ut det ytre direktivet.
Hvis koden utfรธres vellykket, vil fรธlgende utdata vises nรฅr du kjรธrer koden i nettleseren.
Utgang:
Fra utgangen,
- Det kan ses at bรฅde ytre og indre direktiver har blitt kalt, og teksten i begge div-taggene vises.
Hรฅndtering av hendelser i et direktiv
Aktiviteter slike museklikk eller knappeklikk kan hรฅndteres fra selve direktivene. Dette gjรธres ved hjelp av lenkefunksjonen. Koblingsfunksjonen er det som lar direktivet knytte seg til DOM-elementene pรฅ en HTML-side.
Syntaks:
Syntaksen til lenkeelementet er som vist nedenfor
link: function ($scope, element, attrs)
Koblingsfunksjonen godtar normalt 3 parametere inkludert omfanget, elementet som direktivet er assosiert med og attributtene til mรฅlelementet.
La oss se pรฅ et eksempel pรฅ hvordan vi kan oppnรฅ dette.
<!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>
Kode Forklaring
- Vi bruker lenkefunksjonen som definert i vinkel for รฅ gi direktivene muligheten til รฅ fรฅ tilgang til hendelser i HTML DOM.
- Vi bruker nรธkkelordet "element" fordi vi รธnsker รฅ svare pรฅ en hendelse for et HTML DOM-element, som i vรฅrt tilfelle vil vรฆre "div"-elementet. Vi bruker da "bind"-funksjonen og sier at vi รธnsker รฅ legge til tilpasset funksjonalitet til klikkhendelsen til elementet. "Klikk"-ordet er nรธkkelordet, som brukes til รฅ angi klikkhendelsen til en HTML-kontroll. HTML-knappkontrollen har for eksempel klikkhendelsen. Siden vi i vรฅrt eksempel รธnsker รฅ legge til en egendefinert kode til klikkhendelsen til ยซdevยป-taggen vรฅr, bruker vi ยซclickยป-nรธkkelordet.
- Her sier vi at vi รธnsker รฅ erstatte elementets indre HTML (i vรฅrt tilfelle div-elementet) med teksten 'Du klikket meg!'.
- Her definerer vi vรฅr div-tag for รฅ bruke det tilpassede ng-guru-direktivet.
Hvis koden utfรธres vellykket, vil fรธlgende utdata vises nรฅr du kjรธrer koden i nettleseren.
Utgang:
- Til รฅ begynne med vil teksten "Klikk meg" vises til brukeren fordi dette er det som opprinnelig ble definert i div-taggen. Nรฅr du faktisk klikker pรฅ div-taggen, vil utdataene nedenfor vises
Sammendrag
- Man kan ogsรฅ lage et tilpasset direktiv som kan brukes til รฅ injisere kode i hovedvinkelapplikasjonen.
- Egendefinerte direktiver kan lages for รฅ kalle medlemmer definert i scope-objektet i en bestemt kontroller ved รฅ bruke nรธkkelordene 'Controller', 'controllerAs' og 'template'.
- Direktiver kan ogsรฅ nestes for รฅ gi innebygd funksjonalitet som kan vรฆre nรธdvendig avhengig av applikasjonens behov.
- Direktiver kan ogsรฅ gjรธres gjenbrukbare slik at de kan brukes til รฅ injisere felles kode som kan kreves pรฅ tvers av ulike nettapplikasjoner.
- Direktiv kan ogsรฅ brukes til รฅ lage tilpassede HTML-koder som vil ha sin egen funksjonalitet definert i henhold til forretningskravet.
- Hendelser kan ogsรฅ hรฅndteres fra direktiver for รฅ hรฅndtere DOM-hendelser som knapp- og museklikk.
















