at angularjs direktiver

, at angularjs direktiver,,,,, 266,,,,,,,, 69,,,,,,, det cyber - mandag envato tuts + kurser vil blive reduceret til $3.- og' t miss.,, direktiver, er en af de mest magtfulde dele af angularjs, hjælper du udvide grundlæggende elementer, attributter og skabe http: /////////, genanvendelige og testes, kode.i denne lektion, jeg vil vise dig, hvordan man bruger angularjs direktiver med virkelige bedste praksis.  ,, hvad jeg mener med  , direktiver,  , er for det meste skik direktiver i ministeriet.jeg vil ikke forsøge at lære dig at bruge indbygget direktiver som  , ng gentager, ng, osv. jeg vil vise dig, hvordan man bruger skik direktiver for at skabe deres egen komponenter.  , udkast, enkelt direktiv, direktiv restriktioner, isolerede anvendelsesområde, direktiv kikkerter, direktiv arv, direktiv fejlfinding, direktiv enhed testning, direktiv anvendelsesområdet testning, konklusion.enkle direktiver,,,,, jeg siger, at du har en ehandel ansøgning om bøger, og du er meget specifikke bog detaljeret i flere områder, som f.eks.   bemærkninger, brugerprofil sider, artikler osv. din bog detaljeret dims kan være som nedenfor:,,,,, i denne dims, der er en bog image, titel, beskrivelse, bemærkninger og kreditvurdering.indsamling af oplysninger, og at en specifik dom element kan være svært i hvert sted, du vil bruge den.lad os widgetize denne opfattelse ved hjælp af en angularjs direktiv.  ,, vinkel. - modul ('masteringangularjsdirectives, [...]). direktiv ('book, function() {afkast (begrænse: »e« anvendelsesområde: {data: "= '), templateurl: http: //templates /bog widget.'}}) en   direktiv funktion har været anvendt i ovenstående eksempel at etablere et direktiv.det hedder i direktivet er bog.  , dette direktiv kommer et objekt, og lad os tale lidt om dette objekt., begrænse,  , for at definere direktivets art, og det kan være en,   (, a, ttribute), c (, c, lass), e (e, lement) og m,   (co, m, ().kan du se den udnyttelse af hver henholdsvis nedenfor.,, type, anvendelse, en < div., bog, > < /div > c < div klasse = "bog," > < /div > e <, bog data = "book_data" > < /, bog, > m <!- direktiv:, bog, - - >,, anvendelsesområde,  , for forvaltningen af direktivets anvendelsesområde.i ovennævnte tilfælde, bog data overføres til direktiv model ved hjælp af   "=", omfanget af type.jeg vil tale om i detaljer om rækkevidden i de følgende afsnit., templateurl,,  , anvendes til at kalde en baggrund med henblik på at gøre konkret indhold ved hjælp af data, der overføres til direktivets anvendelsesområde.du kan også bruge, model, og give html kode direkte, som denne:,,...model: (< div > bog info < /div > "... i vores tilfælde, vi har en kompliceret html struktur, og det er grunden til, at jeg valgte  , templateurl,,   mulighed., 2.direktiv restriktioner, direktiver, er defineret i javascript fil af din angularjs projekt, og som anvendes i html side.det er muligt at anvende   angularjs   direktiver i html sider som følger:,, a (attribut), i anvendelse,   direktiv navn anvendes i standard html elementer.jeg siger, at du har en role-based menu i ehandel anvendelse.menuen er oprettet i henhold til deres nuværende rolle.kan du definere et direktiv for at afgøre, om den nuværende menu bør vises eller ej.du kan lide under: http: //menu, < ul > < li > hjem < /li > < li > seneste nyheder < /li > < li begrænset > brugeradministration < ///////li > < li begrænset > kampagne forvaltning < /li > < /ul >,, og direktivet som følger:,, app. direktiv ("begrænset" function() {afkast (begrænse: »a«, link: funktion (anvendelsesområde, element, attrs) (//en) kontrol funktion var isauthorized = checkauthorization(); hvis (!isauthorized) {element. css ('display "," ingen ");}}}}), hvis de bruger  , begrænset,   direktiv i menuen element som en attribut, kan du gøre en adgangsniveau kontrol for hver menu.hvis den pågældende bruger ikke er tilladt, at specifikke menu vil ikke blive vist.  ,, hvad er det  , link,  , funktion, der?enkelt forbindelsen funktion er den funktion, som de kan bruge til at   udføre direktiv om særlige aktioner.direktivet er ikke kun gøre nogle html kode ved at bidrage med input.du kan også binde funktioner til direktiv element, kalder en tjeneste og ajourføre direktiv værdi, få direktiv attributter, hvis det er en  , e,  , type direktiv, osv.), c (klasse), kan du bruge direktivet navn i html element klasser.hvis du vil bruge dette direktiv som, c,,,  , du kan opdatere direktivet begrænser, som, c,  , og bruge det som følger:,, < ul > < li > hjem < /li > < li > seneste nyheder < /li > < li klasse = "nav begrænset" > brugeradministration < /li > < li klasse = "nav aktive begrænset" > kampagne forvaltning < /li > <. /ul >, hvert enkelt element har allerede en klasse for stil, og som   den  , begrænsede, klasse er   tilføjes, er det faktisk et direktiv.,, e (del), du behøver ikke at bruge et direktiv i en html element.du kan skabe deres egen element ved hjælp af en angularjs direktiv med en, e,   begrænsning.  , lad os sige, at du har en bruger dims i din ansøgning viser, at brugernavn, avatar, og omdømme,  , flere steder i din ansøgning.du kan bruge sådan et direktiv:,, app. direktiv ("bruger", function() {afkast (begrænse: »e«, link: funktion (anvendelsesområde, element, attrs) (scope.username = attrs.username; scope.avatar = attrs.avatar; scope.reputation = attrs.reputation;}, model: (< div > brugernavn: {{navn}}, avatar: {{avatar}}, omdømme: {{ry}} < /div > '}})http: //kode:,, < brugeren brugernavn = "huseyinbabal" avatar = "https://www.gravatar.com/avatar/ef36a722788f5d852e2635113b2b6b84?s = 128 & d = identicon & r = pg "ry =" 8012 "> < /bruger >,, i ovenstående eksempel, en skik element er skabt og attributter, der er ligesom, brugernavn, avatar, og  , omdømme.jeg vil gerne henlede opmærksomheden på forbindelsen funktion.element attributter er overladt til direktiv anvendelsesområde.den første parameter i den forbindelse funktion er direktivets anvendelsesområde.den tredje del af direktivet, er attributten direktivets formål, hvilket betyder, at du kan læse en attribut fra custom direktiv ved hjælp af, attrs. attr_name,.attributternes værdier er overladt til anvendelsesområdet, således at de er  , der anvendes i modellen.  , faktisk, du kan gøre denne operation i en kortere vej, og jeg vil tale om det senere.dette eksempel er for forståelsen af hovedidéen bag anvendelse.,, m (bemærkninger), og denne anvendelse ikke er meget, men jeg vil vise, hvordan det anvendes.lad os sige, at du har brug for en kommentar til deres ansøgning til brug i form af mange steder.du kan gøre dette ved at anvende den   følgende direktiv:,, app. direktiv ("kommentarer", function() {{begrænse tilbage: "m", model: (< textarea klasse = "kommentarer" > < /textarea > ')), og i   html element:,, <!- direktiv: bemærkning - >,, 3.isolerede anvendelsesområde, hvert direktiv har sine egne rammer, men du skal være forsigtig med de data, bindende med direktivet erklæring.vi siger, at de gennemfører, kurv,  , en del af deres uddannelse i anvendelse.på kurven side du har der allerede er tilføjet her før.Each item has its amount field to select how many items you want to buy, like below:,,,,,Here's the directive declaration:,,app.directive("item", function() { return { restrict: 'E', link: function(scope, element, attrs) { scope.name = attrs.name; }, template: '<div><strong>Name:</strong> {{name}} <strong>Select Amount:</strong> <select name="count" ng-model="count"><option value="1">1</option><option value="2">2</option></select> <strong>Selected Amount:</strong> {{count}}</div>' } }),,And in order to display three items in HTML:,,<item name="Item-1"></item> <item name="Item-2"> < /post > < post = "item-3" > < /post >,, problemet er her, at når du vælger, størrelsen af den ønskede punkt, alle beløb, dele af poster vil blive ajourført.hvorfor?fordi der er tovejs data bindende med et navn, greve,   men anvendelsesområde er ikke isolerede.In order to isolate scope, just add ,scope: {},, ,to the directive attribute in the return section:,,app.directive("item", function() { return { restrict: 'E', scope: {}, link: function(scope, element, attrs) { scope.name = attrs.name; }, template: '<div><strong>Name:</strong> {{name}} <strong>Select Amount:</strong> <select name="count" ng-model="count"><option value="1">1</option><option value="2">2</option></select> <strong>Selected Amount:</strong> {{count}}</div>' } }),,This leads your directive to have its own isolated scope so two-way data binding will occur inside this directive separately.jeg vil også nævne om  , anvendelsesområde, tilskriver senere.,, 4.direktiv kikkerter,, den største fordel ved direktivet er, at det er en   genanvendelige komponenter, der kan benyttes let kan du   selv, fremsætte nogle supplerende egenskaber, til nævnte direktiv.men hvordan er det muligt at give yderligere værdi, der er bindende, eller udtryk for et direktiv med henblik på data, der skal benyttes i direktivet?,,, "@" anvendelsesområde:,   denne type foranstaltninger anvendes som værdi for direktivets anvendelsesområde.lad os sige, at du vil skabe en dims til en anmeldelse budskab:,, app. controller ("messagectrl", function() ($scope.message = "produkt skabt!"; ') app. direktiv ("anmeldelse", function() {afkast (begrænse: »e« anvendelsesområde: {budskab: "('}, model: (< div klasse =" beredskab "> {{besked}} < /div > '));,, og du kan bruge:,, < meddelelse om anmeldelse af =" {{besked}} "> < /meddelelse >, i dette eksempel er beskeden værdi er   blot henvist til direktiv anvendelsesområde.det afsmeltede html indhold vil være:,, < div klasse = "beredskab" > produkter, der er skabt.< /div >,,, "= =" anvendelsesområde:  , i det omfang karakteren, omfanget variabler er gået i stedet for de værdier, som   betyder, at  , vi vil ikke passere, {{besked}},, vi vil vedtage, besked i stedet.årsagen til dette træk er opbygningen af tovejs data bindende mellem direktivet og side elementer eller kontrollører.lad os se det i handling.,,. direktiv ("bookcomment", function() {afkast (begrænse: »e« anvendelsesområde: {tekst: "= ="}, model: (< input type = "tekst" ng model = "tekst" /> '}}), i det direktiv, vi forsøger at skabe en dims, for at kommentere teksten input til at fremsætte en bemærkning til en bestemt bog.som du kan se, er dette direktiv kræver en attribut, tekst,   at opbygge gensidig data bindende mellem andre elementer på siderne.du kan bruge det på side:,, < span > dette er tekstrammen om direktivet < /span > < bog bemærkning tekst = "commenttext" > < /bog bemærkning >, vil det blot vise et tekstboks på side, så   lad os tilføje noget mere til at interagere med dette direktiv:,, < span > dette er tekstrammen i s < /span > < input type = "tekst" ng model = "commenttext" /> < br /> < span > dette er tekstrammen om direktivet < /span > < bog bemærkning tekst = "commenttext" > < /bog bemærkning >,, når du type noget i den første tekst boks, det vil blive skrevet i den anden tekst boks.du kan gøre det omvendt.i   direktiv, vi passerede anvendelsesområdet variabel, commenttext, i stedet for den værdi, og denne variabel er data bindende henvisning til den første tekst boks.  ,,, "&" anvendelsesområde:  , vi er i stand til at vælte den værdi, og der henvises til direktiver.i det omfang, som vi vil se på, hvordan at give udtryk for dette direktiv.i eksempler fra praksis, kan det være nødvendigt at give en bestemt funktion (udtrykket) til direktiver for at undgå kobling.nogle gange, direktiver ikke har brug for at vide meget om idéen bag dette udtryk.for eksempel, et direktiv, som i bogen   for dig, men ved ikke, hvordan man gør det.for at gøre det, kan du følge en struktur, som denne:,,. direktiv ("likebook", function() {afkast (begrænse: »e« anvendelsesområde: {som: "&. '}, model: (< input type =" knap "ng klik =" like() "værdi =" som "/>'}}), i dette direktiv, et udtryk, vil blive vedtaget, at direktivet knap via, som tilskriver.lad os definere en funktion, som den registeransvarlige, og send det til direktivet i html. $scope.likefunction = function() (varsling ("jeg kan godt lide bogen!")}, vil dette være indenfor den registeransvarlige, og modellen vil være:,, < ligesom bogen som = "likefunction()" > < ligesom bog >,,, likefunction(), kommer fra den registeransvarlige og overføres til direktivet.hvad hvis du vil passere en parameter, likefunction(),?for eksempel, kan det være nødvendigt at vedtage en rating værdi til det, likefunction(),.det er meget enkelt: at tilføje en   argument til funktion inden for den registeransvarlige, og tilføje en input - element til direktiv kræver, at begynde at regne fra brugeren.du kan gøre det, som vist nedenfor:,,. direktiv ("likebook", function() {afkast (begrænse: »e« anvendelsesområde: {som: "&. '}, model: (< input type =" tekst "ng model =" starcount "indikation af en art =" ind sats er her. "/> < br /> + < input type =" knap "ng klik =" ({stjerne: starcount}) "værdi =" som "/>'}}), $scope.likefunction = funktion (star) (varsling (" jeg kan godt lide bogen!og gav "+" + "stjerne"), < ligesom bogen som = "likefunction (star)" > < ligesom bog >,, som du kan se,   tekstboks kommer fra direktivet.tekstrubrik værdi er bundet til den funktion,   argument som ({stjerne: starcount}).star, er, at den registeransvarlige funktion, og starcount i tekstboks værdi bindende.  , 5.direktiv arv, nogle gange, du kan have et forhold, der eksisterer i flere direktiver.de kan være i et direktiv, så de går i arv fra barnet direktiver.  , lad mig give dig en rigtig   eksempel.vil du sende statistiske data, når kunder flytte deres   mus markør til   toppen af en bestemt bog.du kan gennemføre et muse klik   begivenhed for den bog direktiv, men hvad hvis det anvendes af et direktiv?i dette tilfælde kan du bruge arv af direktiver som nedenfor:,, app. direktiv ('mouseclicked, function() {afkast (begrænse: »e« anvendelsesområde: {}, kontrollør: "mouseclickedctrl som mouseclicked"}}), er dette et moderdirektiv, være overtaget af barn direktiver.som du kan se, er der en registeransvarlig attribut i direktivet ved hjælp af   "som" direktiv.lad os definere den registeransvarlige også:,, app. controller ('mouseclickedctrl, funktion ($element) (var - mouseclicked =. =) mouseclicked.booktype; mouseclicked.setbooktype = funktion (type) (mouseclicked.booktype = type}; $element. bind ("klik", function() (varsling ("type bog:" + mouseclicked.booktype + "sendt til statistisk analyse."); ')}), i den registeransvarlige, vi kun sætter en tilsynsførende instans af den variable, booktype, ved hjælp af barn direktiver.når du klikker på en bog eller blad, typen af element vil blive sendt til den anden tjeneste (jeg brugte en indberetning funktion blot for at vise, hvor data).hvordan vil barn direktiver kunne bruge dette direktiv?,, app. direktiv ('ebook, function() {{kræve tilbage: "mouseclicked" link: funktion (anvendelsesområde, element, attrs, mouseclickedctrl) (mouseclickedctrl. setbooktype ("ebook");}}}). direktiv ('magazine, function() {{kræve tilbage: "mouseclicked" link: funktion (anvendelsesområde, element, attrs, mouseclickedctrl) (mouseclickedctrl. setbooktype ("magazine");}}}), som du kan se, barn direktiver brug  , kræver, at et direktiv er nøgleordet.   og en vigtigere punkt er den fjerde argument i forbindelse funktion i barn direktiver.dette argument henviser til den registeransvarlige attribut i et direktiv, betyder det, at barnet direktiv kan bruge   tilsynsførende funktion, setbooktype, inden den registeransvarlige.  , hvis de nuværende element er en ebook, du kan bruge det første direktiv, og, hvis det er et blad, du kan bruge den anden:,, < a > < mus faldt ebook > "game of thrones" (klik mig) < /muse klik > < /a > < br /> < en > < mus klikkede blad > pc world (klik mig) < /muse klik > < /a >,, barn direktiver som en ejendom af det oprindelige direktiv.vi har fjernet brugen af museklik begivenhed for hvert barn direktiv ved at sætte den afdeling i grunddirektivet.,, 6.direktiv fejlfinding,, når du bruger direktiver i modellen, hvad du ser på side er den samlede udgave af direktivet.nogle gange vil du se direktivet anvendelse for fejlretning.for at se uncompiled version af det nuværende punkt, du kan bruge, ng, ikke - bindable,.For example, let's say you have a widget that prints the most popular books, and here is the code for that:,,<ul> <li ng-repeat="book in books">{{book}}</li> </ul>,,The book's scope variable comes from the controller, and the output of this is as follows:,,,,,If you want to know the directive usage behind this compiled output, you can use this version of the code:,,<ul ng-non-bindable=""> <li ng-repeat="book in books">{{book}}</li> </ul>,,This time the output will be like below:,,,,,It is cool up to now, but what if we want to see both the uncompiled and compiled versions of the widget? det er tid til at skrive en skik direktiv, som vil gøre en avanceret debugging - operation.  , app. direktiv ('customdebug, funktion ($udarbejde) (afkast (terminal: det er rigtigt, link: funktion (anvendelsesområde, element) (var - currentelement = element. clone(); currentelement. removeattr ("skik ser"); var newelement = $udarbejde (currentelement) (anvendelsesområde); element. attr ("stil", "grænse: 1px solid rød"); element. efter (newelement)}}}), i dette direktiv, vi er kloning er det element, der er i ser - modus, således at det ikke er   ændret efter en række af operationer.efter kloning, fjerne, sædvaner, ser på,   direktiv for ikke at handle, som ser på mode, og så samle det med $complile,, som er   allerede injiceres i direktivet.vi har givet en stil, at de ser på mode element til at understrege den ordnede.det endelige resultat vil være som følger:,,,,, du kan redde din udvikling ved hjælp af denne slags debugging - direktiv til at påvise årsagen til eventuelle fejl i dit projekt. 7.direktiv enhed testning, som de allerede ved, at enhed test er en meget vigtig del af udvikling og fuldstændig kontrol den kode, du har skrevet, og   forhindre potentielle insekter.jeg vil ikke dykke dybt ind i enhed testning, men vil give dig et fingerpeg om, hvordan til at teste direktiver på to måder.,, jeg vil bruge jasmine til enhed, afprøvning og karma for enheden test runner.   for at bruge karma, blot ved at installere det globalt, new public management installere - g karma karma cli, du er nødt til at have node.js og   new public management monteret på din computer.efter montering, åbne kommandolinjen, gå til dit projekt root mappe, og type, karma lokalitet.det vil stille dig et par spørgsmål som nedenfor for at nedsætte deres krav.,,,,, bruger jeg webstorm for udvikling, og hvis du bruger også webstorm, bare klik på, karma.conf.js og udvælge, løb, karma. conf.js.  , dette vil henrette alle de test, der er gennemført i karma conf. du kan også teste med  , karma,   kommando linjen i projektet root mappe.  , der handler om miljøet fælde, så   lad os skifte til prøvningen, lad os sige, at vi ønsker at   test bogen direktiv.når vi vedtager en titel til   direktiv, bør det være   samlet i en bog detaljeret holdning.så lad os komme i gang, og beskriv ("bog test", function() {var element var anvendelsesområde; beforeeach (modul ("masteringangularjsdirectives") beforeeach (injicere (funktion ($udarbejde, $rootscope) (anvendelsesområde = $rootscope; element = vinkel. element (< booktest afsnit ='test "> < /booktest >"); $udarbejde (del) ($rootscope) anvendelsesområde. $digest()})); den ("direktiv bør være vellykket udarbejdet", function() {forvente (element. html()). der ("test"))))), i ovennævnte test, vi afprøver et nyt direktiv, booktest,,.  , dette direktiv tager argumentet, titel,  , og skaber en div ved anvendelse af dette afsnit.i testen, før hver prøvning, afsnit,   opfordrer vi vores modul  , masteringangularjsdirectives,,   først.så vi skaber et direktiv, booktest,,.,,   i hver test skridt, direktivet produktion vil blive testet.denne test er kun en værdi check.,, 8.direktiv anvendelsesområdet testning, i dette afsnit vil vi prøve af direktivets anvendelsesområde, booktest,,.  , dette direktiv skaber en bog detaljeret holdning til side, og når du klikker det detaljeret afsnit, et anvendelsesområde, variable, betragtes,  , vil blive fastsat som sand.i vores test, vi vil undersøge, om det set,  , skal, når de klik begivenhed udløses.direktivet er:,,. direktiv ('booktest, function() {afkast (begrænse: »e«, anvendelsesområde (afsnit: "('}, erstatte: det er rigtigt, model: (< div > {{navn}} < /div >, link: funktion (anvendelsesområde, element, attrs) {element. bind (" klik ", function() (konsol. log (" bog set! "); scope.viewed = sandt.})}}}), med henblik på at fastsætte en begivenhed som et element i angularjs i direktivet, kan du bruge den  , link, attribut.inden for denne attribut, du har den aktuelle element, som er direkte forbundet med   et klik begivenhed.for at afprøve dette direktiv, kan du bruge følgende:,, beskrive ("bog test", function() {var element var anvendelsesområde; beforeeach (modul ("masteringangularjsdirectives") beforeeach (injicere (funktion ($udarbejde, $rootscope) (anvendelsesområde = $rootscope; element element ("= vinkel. < booktest afsnit ='test" > < /booktest > "); $udarbejde (del) ($rootscope) anvendelsesområde. $digest()})); den (" anvendelsesområde kunne lide bør gælde, når bogen kunne lide ", function() {element. triggerhandler (" klik "); forventer (element. isolatescope(). betragtet). der (korrekt)})}), i test - afdeling, et klik begivenhed udløses ved hjælp af   element. triggerhandler (" klik ").når en   klik begivenhed udløses, betragtes variabel skal fastsættes som sand.denne værdi er bekræftet ved hjælp af  , forventer (element. isolatescope(). betragtet). der (korrekt),.,, 9.konklusion, med henblik på at udvikle modulære og testes web - projekter, angularjs er den bedste i fælles.direktiver er en af de bedste dele af angularjs, og dette betyder mere ved du om angularjs direktiver, mere modulopbygget og testes projekter kan man udvikle.  , i denne lektion, jeg har forsøgt at vise dig den ægte bedste praksis om direktiver, og huske på, at du er nødt til at gøre en masse i praksis for at forstå logikken bag direktiverne.jeg håber, denne artikel bidrager til angularjs direktiver, forstår du.

Book Widget
Simple Cart


Sample Directive
Karma Test Initialization



Previous:
Next Page: