Rutare AngularJs cu parametri
โก Rezumat inteligent
Rutarea รฎn AngularJS transformฤ o singurฤ paginฤ HTML รฎntr-o aplicaศie multi-view prin hartฤping URL fragmente cฤtre ศabloane ศi controlere. Modulul ngRoute ศi serviciul $routeProvider definesc aceste hฤrศipings, รฎn timp ce directiva ng-view injecteazฤ ศablonul corespunzฤtor.

รnainte de a analiza cum funcศioneazฤ rutarea รฎn AngularJS, este util sฤ รฎnศelegem tipul de aplicaศie pentru care a fost construitฤ rutarea. Secศiunea de mai jos stabileศte acest context, iar fiecare tehnicฤ care urmeazฤ se bazeazฤ pe acesta.
Ce sunt aplicaศiile cu o singurฤ paginฤ?
Aplicaศiile cu o singurฤ paginฤ, sau SPA-uri, sunt aplicaศii web care รฎncarcฤ o singurฤ paginฤ HTML ศi apoi actualizeazฤ dinamic pagina respectivฤ pe mฤsurฤ ce utilizatorul interacศioneazฤ cu ea. รn loc sฤ solicite un document nou de la server pentru fiecare clic, un SPA schimbฤ doar porศiunea paginii care s-a modificat.
Acest design creeazฤ o problemฤ. Dacฤ browserul nu navigheazฤ niciodatฤ cฤtre un document nou, bara de adrese nu se schimbฤ niciodatฤ, deci utilizatorul nu poate adฤuga un ecran la favorite, nu รฎl poate partaja sau nu poate folosi butonul รnapoi. Rutarea rezolvฤ exact aceastฤ problemฤ.
Ce este rutarea รฎn AngularJS?
Rutare รฎn AngularJS este o metodฤ care vฤ permite sฤ creaศi aplicaศii cu o singurฤ paginฤ. Vฤ permite sฤ creaศi diferite URLs pentru conศinut diferit รฎn aplicaศiile web. Rutarea AngularJS ajutฤ, de asemenea, la afiศarea mai multor conศinuturi รฎn funcศie de ruta aleasฤ. Este specificatฤ รฎn URL dupฤ semnul #.
Sฤ luฤm exemplul unui site gฤzduit prin intermediul URL http://example.com/index.html.
Aceastฤ paginฤ gฤzduieศte ecranul principal al aplicaศiei tale. Sฤ presupunem cฤ aplicaศia organizeazฤ un eveniment ศi utilizatorul doreศte sฤ listeze evenimentele, sฤ vizualizeze unul รฎn detaliu sau sฤ ศteargฤ unul. รntr-o aplicaศie cu o singurฤ paginฤ cu rutarea activatฤ, toate acestea sunt disponibile prin intermediul urmฤtoarelor linkuri.
Simbolul # va fi folosit รฎmpreunฤ cu diferitele rute (ShowEvent, DisplayEvent ศi DeleteEvent).
- Pentru a vedea toate evenimentele, utilizatorul este direcศionat cฤtre http://example.com/index.html#ShowEvent
- Pentru a vedea un anumit eveniment, li se รฎndrumฤ cฤtre http://example.com/index.html#DisplayEvent
- Pentru a ศterge un eveniment, aceศtia sunt direcศionaศi cฤtre http://example.com/index.html#DeleteEvent
Reศineศi cฤ principalul URL rฤmรขne la fel. Se schimbฤ doar fragmentul de dupฤ #, iar acel fragment este ceea ce AngularJS urmฤreศte. Odatฤ ce conceptul este stabilit, urmฤtoarea secศiune prezintฤ componentele pe care trebuie sฤ le conectaศi รฎnainte ca oricare dintre ele sฤ funcศioneze.
Adฤugarea rutei AngularJS folosind $routeProvider
Aศa cum s-a discutat anterior, rutele รฎn AngularJS sunt folosite pentru a direcศiona utilizatorul cฤtre o altฤ vizualizare a aplicaศiei. Aceastฤ direcศionare se face pe aceeaศi paginฤ HTML, astfel รฎncรขt utilizatorul are experienศa cฤ nu a pฤrฤsit pagina.
Pentru a implementa rutarea, urmฤtorii paศi principali trebuie implementaศi รฎn aplicaศia dvs. รฎntr-o anumitฤ ordine.
- Referinศฤ angular-route.js. Aceasta JavaScenariu fiศier, dezvoltat de Google, conศine toate funcศionalitฤศile de rutare ศi trebuie inclus pentru ca aplicaศia sฤ poatฤ face referire la nevoile de rutare ale modulelor.
- Adฤugaศi o dependenศฤ la modulul ngRoute din cadrul aplicaศiei. Fฤrฤ aceastฤ dependenศฤ, rutarea nu poate fi utilizatฤ deloc รฎn aplicaศia AngularJS.
Mai jos este sintaxa generalฤ a acestei declaraศii. Aceasta este doar o declaraศie normalฤ a unui modul cu includerea cuvรขntului cheie ngRoute.
var module = angular.module("sampleApp", ['ngRoute']);
- Configuraศi $routeProvider. Acesta oferฤ diversele rute din aplicaศia dvs., iar sintaxa precizeazฤ pur ศi simplu cฤ, atunci cรขnd este aleasฤ calea relevantฤ, se foloseศte ruta pentru a afiศa vizualizarea datฤ.
when(path, route)
- Linkuri cฤtre traseul dvs. din pagina dvs. HTML. รn pagina dvs. HTML, veศi adฤuga legฤturi de referinศฤ la diferitele rute disponibile รฎn aplicaศia dvs.
<a href="#!/route1">Route 1</a><br/>
- รn cele din urmฤ ar fi includerea directiva ng-view, care ar fi รฎn mod normal รฎntr-o etichetฤ div. Aceasta ar fi folositฤ pentru a injecta conศinutul vizualizฤrii atunci cรขnd este aleasฤ ruta relevantฤ.
๐ Sfat: Toศi cei cinci paศi sunt obligatorii. O referinศฤ angular-route.js lipsฤ este cel mai frecvent motiv pentru care o rutฤ nu face nimic รฎn mod silenศios, deoarece $routeProvider nu existฤ fฤrฤ ea. Urmฤtoarea secศiune prezintฤ toศi cei cinci รฎntr-un exemplu funcศional.
Exemplu de rutare AngularJS
Acum, sฤ ne uitฤm la un exemplu de rutare folosind paศii menศionaศi mai sus.
รn exemplul nostru de rutare AngularJS cu parametri,
- Un link este pentru a afiศa subiectele pentru un AngularJS desigur, iar celฤlalt este pentru Node.js curs.
- Cรขnd utilizatorul face clic pe oricare dintre linkuri, vor fi afiศate subiectele pentru cursul respectiv.
Pas 1) Includeศi fiศierul cu rutฤ unghiularฤ ca referinศฤ de script.
Acest fiศier de rutฤ este necesar pentru a utiliza funcศionalitฤศile oferite de existenศa mai multor rute ศi vizualizฤri. Acest fiศier poate fi descฤrcat de pe site-ul web AngularJS.
Pas 2) Adฤugaศi etichete href care vor reprezenta link-uri cฤtre โSubiecte Angular JSโ ศi โSubiecte Node JSโ.
Pas 3) Adฤugaศi o etichetฤ div cu directiva ng-view care va reprezenta vizualizarea.
Acest lucru va permite vizualizarea corespunzฤtoare sฤ fie injectatฤ ori de cรขte ori utilizatorul face clic pe โSubiecte JS Angularโ sau โSubiecte JS Nodeโ.
Pas 4) รn eticheta de script pentru AngularJS, adฤugaศi โmodulul ngRouteโ ศi serviciul โ$routeProviderโ.
Code Explicaลฃie:
- Includeศi โmodulul ngRouteโ. Cu acesta implementat, Angular gestioneazฤ automat rutarea ศi รฎnศelege toate comenzile de rutare.
- `$routeProvider` este un serviciu care ascultฤ รฎn fundal rutele apelate. Cรขnd utilizatorul dฤ clic pe un link, acesta detecteazฤ acest lucru ศi decide ce rutฤ sฤ urmeze.
- Creaศi o rutฤ pentru linkul Angular: cรขnd se face clic pe acesta, injectaศi Angular.html ศi utilizaศi โAngularControllerโ pentru logica de business.
- Creaศi o rutฤ pentru linkul Node, care injecteazฤ Node.html ศi utilizeazฤ โNodeControllerโ รฎn acelaศi mod.
Pas 5) Urmฤtorul este sฤ adฤugaศi controlere pentru a procesa logica de afaceri atรขt pentru AngularController, cรขt ศi pentru NodeController.
รn fiecare controller, creฤm o matrice de perechi cheie-valoare pentru a stoca numele ศi descrierile subiectelor pentru fiecare curs. Variabila matrice โtutorialโ este adฤugatฤ la obiectul scope pentru fiecare controller.
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>Event Registration</title> </head> <body ng-app="sampleApp"> <script src="https://code.angularjs.org/1.8.3/angular.min.js"></script> <script src="https://code.angularjs.org/1.8.3/angular-route.js"></script> <h1> Guru99 Global Event</h1> <div class="container"> <ul> <li><a href="#!/Angular">Angular JS Topics</a></li> <li><a href="#!/Node">Node JS Topics</a></li> </ul> <div ng-view></div> </div> <script> var sampleApp = angular.module('sampleApp', ['ngRoute']); sampleApp.config(['$routeProvider', function($routeProvider) { $routeProvider. when('/Angular', { templateUrl: 'Angular.html', controller: 'AngularController' }). when('/Node', { templateUrl: 'Node.html', controller: 'NodeController' }); }]); sampleApp.controller('AngularController', function($scope) { $scope.tutorial = [ {Name: "Controllers", Description: "Controllers in action"}, {Name: "Models", Description: "Models and binding data"}, {Name: "Directives", Description: "Flexibility of Directives"} ]; }); // NodeController follows the same shape with Node.js topics sampleApp.controller('NodeController', function($scope) { $scope.tutorial = [{Name: "Promises", Description: "Power of Promises"}]; }); </script> </body> </html>
โ ๏ธ Corecศiile au fost aplicate. <title> eticheta stฤtea รฎnฤuntru <body>, chrset="UTF 8" a fost scris greศit, al doilea link indica #Node.html รฎn loc de ruta รฎnregistratฤ /Nodeศi cฤile ศablonului aveau o barฤ oblicฤ iniศialฤ care porneศte de la rฤdฤcina domeniului.
Pas 6) Creaศi pagini numite Angular.html ศi Node.html. Pentru fiecare paginฤ parcurgem paศii de mai jos.
Aceศti paศi se vor asigura cฤ toate perechile cheie-valoare ale matricei sunt afiศate pe fiecare paginฤ.
- Utilizarea directiva ng-repeat pentru a parcurge fiecare pereche cheie-valoare definitฤ รฎn variabila tutorialului.
- Se afiศeazฤ numele ศi descrierea fiecฤrei perechi cheie-valoare.
- Angular.html
<h2>Angular</h2> <ul ng-repeat="ptutor in tutorial"> <li>Course : {{ptutor.Name}} - {{ptutor.Description}}</li> </ul>
- Node.html โ identic cu lista de mai sus, cu titlul schimbat รฎn โNodโ. Ambele ศabloane au acelaศi text
tutorialvariabilฤ, pe care fiecare controler o furnizeazฤ din propriul sฤu domeniu de aplicare.
โ ๏ธ Corecลฃie: Titlul din fiศierul Angular.html original suna โAnglerโ. Ortografia este corectatฤ mai sus.
Dacฤ codul este executat cu succes, urmฤtorul rezultat va fi afiศat atunci cรขnd rulaศi codul รฎn browser.
ieศire:
Dacฤ daศi clic pe linkul AngularJS Topics, va fi afiศat rezultatul de mai jos.
Rezultatul aratฤ clar cฤ,
- Cรขnd se face clic pe linkul โSubiecte Angular JSโ, โโrouteProvider pe care l-am declarat รฎn codul nostru decide ca codul Angular.html sฤ fie injectat.
- Acest cod va fi injectat รฎn eticheta โdivโ, care conศine directiva ng-view. De asemenea, conศinutul pentru descrierea cursului provine din โvariabila tutorialโ care a fฤcut parte din obiectul de aplicare definit รฎn AngularController.
- Cรขnd se face clic pe Node.js Subiecte, va avea loc acelaศi rezultat, iar vizualizarea pentru subiectele Node.js se va manifesta.
- De asemenea, observaศi cฤ pagina URL rฤmรขne la fel. Se schimbฤ doar ruta de dupฤ eticheta #, iar acesta este conceptul aplicaศiilor cu o singurฤ paginฤ. Eticheta #hash din URL este un separator รฎntre rutฤ (care รฎn cazul nostru este โAngularโ) ศi pagina HTML principalฤ (Sample.html).
Exemplul funcศioneazฤ doar atunci cรขnd utilizatorul dฤ clic pe un link care corespunde unei rute รฎnregistrate. Urmฤtoarea secศiune trateazฤ ce ar trebui sฤ se รฎntรขmple atunci cรขnd nu se potriveศte nimic.
Crearea unei rute implicite รฎn AngularJS
Rutarea รฎn AngularJS oferฤ, de asemenea, posibilitatea de a avea o rutฤ implicitฤ. Aceasta este ruta care este aleasฤ dacฤ nu existฤ nicio potrivire pentru ruta existentฤ.
Ruta implicitฤ este creatฤ prin adฤugarea urmฤtoarei condiศii la definirea serviciului $routeProvider.
Sintaxa de mai jos รฎnseamnฤ pur ศi simplu redirecศionarea cฤtre o altฤ paginฤ dacฤ oricare dintre rutele existente nu se potriveศte.
otherwise({
redirectTo: 'page'
});
Sฤ folosim acelaศi exemplu de mai sus ศi sฤ adฤugฤm o rutฤ implicitฤ la serviciul nostru $routeProvider.
sampleApp.config(['$routeProvider', function($routeProvider) { $routeProvider. when('/Angular', { templateUrl: 'Angular.html', controller: 'AngularController' }). when('/Node', { templateUrl: 'Node.html', controller: 'NodeController' }). otherwise({ redirectTo: '/Angular' }); }]);
Code Explicaลฃie:
- Aici folosim acelaศi cod ca mai sus, singura diferenศฤ fiind cฤ folosim instrucศiunea otherwise ศi opศiunea โredirectToโ pentru a specifica ce vizualizare ar trebui รฎncฤrcatฤ dacฤ nu este specificatฤ nicio rutฤ. รn cazul nostru, dorim sฤ fie afiศatฤ vizualizarea โ/Angularโ.
Dacฤ codul este executat cu succes, urmฤtorul rezultat va fi afiศat atunci cรขnd rulaศi codul รฎn browser.
ieศire:
Din ieศire,
- Puteศi vedea clar cฤ vizualizarea implicitฤ afiศatฤ este vizualizarea AngularJS.
- Acest lucru se datoreazฤ faptului cฤ atunci cรขnd pagina se รฎncarcฤ, trece la opศiunea โaltfelโ din funcศia $routeProvider ศi รฎncarcฤ vizualizarea โ/Angularโ.
O rutฤ implicitฤ decide ce vizualizare se รฎncarcฤ. Urmฤtoarea secศiune prezintฤ modul รฎn care o singurฤ rutฤ poate servi mai multe รฎnregistrฤri prin transportul unei valori รฎn URL.
Cum sฤ accesaศi parametrii de pe ruta AngularJS
Angular oferฤ ศi funcศionalitatea de a transmite parametri รฎn timpul rutฤrii. Parametrii sunt adฤugaศi la sfรขrศitul rutei รฎn URL, De exemplu, http://guru99/index.html#/Angular/1. รn acest exemplu de rutare unghiularฤ,
- http://guru99/index.html este principala noastrฤ aplicaศie URL
- Simbolul # este separatorul dintre aplicaศia principalฤ URL ศi traseul
- Angular este traseul nostru
- ศi รฎn cele din urmฤ โ1โ este parametrul care se adaugฤ la traseul nostru
Sintaxa generalฤ este HTMLPage#/route/parameter, deci subiectele anterioare devin Sample.html#/Angular/1, #/Angular/2 ศi #/Angular/3, unde cifra este ID-ul subiectului.
Sฤ analizฤm รฎn detaliu cum putem implementa o rutฤ Angular cu un parametru.
Pasul 1) Adฤugaศi urmฤtorul cod la vizualizarea dvs
- Adฤugaศi un tabel pentru a afiศa utilizatorului toate subiectele cursului Angular JS.
- Adฤugaศi un rรขnd รฎn tabel pentru afiศarea subiectului โControllersโ. Pentru acest rรขnd, setaศi href la โ#!/Angular/1โ, astfel รฎncรขt, dacฤ faceศi clic pe subiect, sฤ fie transmis parametrul 1 din tabel. URL odatฤ cu traseul.
- Adฤugaศi un rรขnd pentru subiectul โModeleโ, cu href setat la โ#!/Angular/2โ, astfel รฎncรขt parametrul 2 sฤ circule รฎn URL.
- Adฤugaศi un rรขnd pentru subiectul โDirectiveโ, cu href setat la โ#!/Angular/3โ, astfel รฎncรขt parametrul 3 sฤ circule รฎn URL.
Pasul 2) Adฤugaศi ID-ul subiectului รฎn funcศia de serviciu routeProvider
รn funcศia de serviciu routeProvider, adฤugaศi :topicId substituent pentru a indica faptul cฤ orice parametru transmis รฎn URL dupฤ ce ruta ar trebui atribuitฤ variabilei topicId.
Pasul 3) Adฤugaศi codul necesar controlerului
- Asiguraศi-vฤ cฤ adฤugaศi mai รฎntรขi โ$routeParamsโ ca parametru atunci cรขnd definiศi funcศia controlerului. Acest parametru va avea acces la toศi parametrii de rutฤ transmiศi รฎn URL.
- โ$routeParamsโ conศine topicId-ul transmis รฎn rutฤ. Ataศarea
$routeParams.topicIdla domeniul de aplicare ca$scope.tutorialidรฎl face disponibil vizualizฤrii ca tutorialid.
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>Event Registration</title> </head> <body ng-app="sampleApp"> <script src="https://code.angularjs.org/1.8.3/angular.min.js"></script> <script src="https://code.angularjs.org/1.8.3/angular-route.js"></script> <h1> Guru99 Global Event</h1> <table class="table table-striped"> <tbody> <tr><td>1</td><td>Controllers</td> <td><a href="#!/Angular/1">Topic details</a></td></tr> <!-- rows 2 and 3 repeat with /Angular/2 and /Angular/3 --> </tbody> </table> <div ng-view></div> <script> var sampleApp = angular.module('sampleApp', ['ngRoute']); sampleApp.config(['$routeProvider', function($routeProvider) { $routeProvider. when('/Angular/:topicId', { templateUrl: 'Angular.html', controller: 'AngularController' }); }]); sampleApp.controller('AngularController', ['$scope', '$routeParams', function($scope, $routeParams) { $scope.tutorialid = $routeParams.topicId; }]); </script> </body> </html>
โ ๏ธ Corecศiile au fost aplicate. Originalul a folosit litera l รฎn loc de cifrฤ 1 in href="#Angular/l", a omis ng-view container, astfel รฎncรขt ศablonul nu avea unde sฤ fie redat ศi s-a รฎncฤrcat angular-route.js รฎnainte angular.min.js, care genereazฤ o eroare de modul.
Pasul 4) Adฤugaศi expresia pentru a afiศa variabila
Adฤugaศi expresia pentru a afiศa variabila tutorialid รฎn pagina Angular.html.
<h2>Angular</h2> <br><br>{{tutorialid}}
Dacฤ codul este executat cu succes, urmฤtorul rezultat va fi afiศat atunci cรขnd rulaศi codul รฎn browser.
ieศire:
รn ecranul de ieศire,
- Dacฤ faceศi clic pe linkul Detalii subiect pentru primul subiect, numฤrul 1 este adฤugat la URL.
- Numฤrul respectiv este luat ca argument โrouteParamsโ ศi devine accesibil รฎn controler.
Citirea unui parametru este simplฤ. Preluarea รฎnregistrฤrii identificate de parametru, รฎnainte de apariศia vizualizฤrii, este sarcina proprietฤศii abordate รฎn continuare.
Cum se preรฎncarcฤ datele cu proprietatea resolve
Controlerul din secศiunea anterioarฤ citeศte un ID de subiect ศi รฎl afiศeazฤ imediat. Aplicaศiile reale trebuie mai รฎntรขi sฤ preia รฎnregistrarea de pe un server, iar dacฤ vizualizarea este redatฤ รฎnainte ca solicitarea sฤ se รฎntoarcฤ, utilizatorul vede un ศablon gol care se completeazฤ un moment mai tรขrziu. resolve eliminฤ acea licฤrire de conศinut gol.
Fiecare cheie din interiorul unui resolve Un obiect este o dependenศฤ pe care AngularJS o pregฤteศte รฎnainte de activarea rutei. Dacฤ valoarea este o promisiune, routerul aศteaptฤ ca aceasta sฤ se stabileascฤ. Numai dupฤ ce fiecare promisiune a fost rezolvatฤ, AngularJS instanศiazฤ controlerul ศi randeazฤ ศablonul, iar valorile rezolvate sunt injectate รฎn controler pe nume, exact ca orice alt serviciu.
sampleApp.config(['$routeProvider', function($routeProvider) { $routeProvider. when('/Angular/:topicId', { templateUrl: 'Angular.html', controller: 'AngularController', resolve: { // The router waits for this promise before rendering topic: ['$http', '$route', function($http, $route) { var id = $route.current.params.topicId; return $http.get('/api/topics/' + id).then(function(response) { return response.data; }); }] } }); }]); // 'topic' is injected already resolved, so no loading state is needed sampleApp.controller('AngularController', ['$scope', 'topic', function($scope, topic) { $scope.topic = topic; }]);
Douฤ comportamente conteazฤ aici. O promisiune respinsฤ anuleazฤ schimbarea rutei ศi lasฤ browserul รฎn vizualizarea curentฤ, astfel รฎncรขt o solicitare eศuatฤ nu produce niciodatฤ o paginฤ nefuncศionalฤ. Cu toate acestea, deoarece routerul se blocheazฤ รฎn timp ce promisiunea este รฎn aศteptare, un punct final lent face ca aplicaศia sฤ parฤ blocatฤ. Pereche resolve cu un indicator de progres condus de $routeChangeStart ศi $routeChangeSuccess evenimente.
โ ๏ธ Avertisment: Nu plasaศi niciodatฤ verificฤri de autentificare doar รฎn interior resolveRespingerea unei rute ascunde o vizualizare, dar nu protejeazฤ datele din spatele acesteia, iar endpoint-ul API trebuie sฤ impunฤ รฎn continuare accesul pe server.
Pe lรขngฤ preรฎncฤrcarea datelor, o rutฤ poate transporta ศi valori de configurare statice. Serviciul descris รฎn continuare prezintฤ modul รฎn care un controler le citeศte.
Cum sฤ utilizaศi serviciul Angular $route
Serviciul $route vฤ permite sฤ accesaศi proprietฤศile rutei. Serviciul $route este disponibil ca parametru atunci cรขnd funcศia este definitฤ รฎn controler. Sintaxa generalฤ a modului รฎn care parametrul $route este pus la dispoziศie de cฤtre controler este prezentatฤ mai jos.
myApp.controller('MyController', function($scope, $route) { ... });
- myApp este modulul AngularJS definit pentru aplicaศia ta.
- MyController este numele controlerului definit pentru aplicaศia dumneavoastrฤ.
- Aศa cum $scope transmite informaศii de la controler cฤtre vizualizare, $route expune proprietฤศile rutei curente.
Sฤ vedem cum putem folosi serviciul $route.
รn acest exemplu,
- Vom crea o variabilฤ personalizatฤ simplฤ numitฤ โtextul meuโ, care va conศine ศirul โAcesta este unghiularโ.
- Vom ataศa aceastฤ variabilฤ rutei noastre. Later Vom accesa acest ศir de caractere din controlerul nostru folosind serviciul $route ศi apoi vom folosi obiectul scope pentru a-l afiศa รฎn vizualizarea noastrฤ.
Deci, haideศi sฤ vedem paศii pe care trebuie sฤ-i facem pentru a realiza acest lucru.
Pas 1) Adฤugaศi o pereche cheie-valoare personalizatฤ la traseu. Aici, adฤugฤm o cheie numitฤ โtextul meuโ ศi รฎi atribuim o valoare โAcesta este unghiularโ.
Pas 2) Adฤugaศi codul relevant la controler.
- Adฤugaศi parametrul $route la funcศia controller. Parametrul $route este un parametru cheie definit รฎn Angular, care permite accesarea proprietฤศilor rutei.
- Variabila โmytextโ care a fost definitฤ รฎn rutฤ poate fi accesatฤ prin referinศa $route.current. Aceasta este apoi atribuitฤ variabilei โtextโ a obiectului scope. Variabila text poate fi apoi accesatฤ din vizualizare รฎn mod corespunzฤtor.
// Only the config and controller change; the page markup is unchanged sampleApp.config(['$routeProvider', function($routeProvider) { $routeProvider. when('/Angular/:topicId', { mytext: "This is angular", // custom key attached to the route templateUrl: 'Angular.html', controller: 'AngularController' }); }]); sampleApp.controller('AngularController', ['$scope', '$routeParams', '$route', function($scope, $routeParams, $route) { $scope.tutorialid = $routeParams.topicId; $scope.text = $route.current.mytext; }]);
Pas 3) Adฤugaศi o referinศฤ la variabila text din obiectul scop ca expresie. Acesta va fi adฤugat la pagina noastrฤ Angular.html, aศa cum se aratฤ mai jos.
Acest lucru va face ca textul โAcesta este unghiularโ sฤ fie injectat รฎn vizualizare. Expresia {{tutorialid}} este aceeaศi cu cea vฤzutฤ รฎn subiectul anterior ศi aceasta va afiศa numฤrul โ1โ.
<h2>Angular</h2> <br><br>{{text}} <br><br>{{tutorialid}}
Dacฤ codul este executat cu succes, urmฤtorul rezultat va fi afiศat atunci cรขnd rulaศi codul รฎn browser.
ieศire:
Din ieศire,
- Putem vedea cฤ textul โAcesta este unghiularโ este afiศat ศi atunci cรขnd facem clic pe oricare dintre linkurile din tabel. ID-ul subiectului este, de asemenea, afiศat รฎn acelaศi timp cu textul.
Fiecare URL afiศat pรขnฤ acum are รฎncฤ simbolul #. Pasul final de configurare รฎl eliminฤ.
Se activeazฤ rutarea HTML5
Rutarea HTML5 este utilizatฤ pentru a crea informaศii curate URLs. รnseamnฤ eliminarea hashtag-ului din URLDeci rutarea URLs, atunci cรขnd se utilizeazฤ rutarea HTML5, ar apฤrea aศa cum se aratฤ mai jos.
Sample.html/Angular/1
Sample.html/Angular/2
Sample.html/Angular/3
Acest concept este cunoscut รฎn mod normal ca prezentarea unei imagini frumoase URL cฤtre utilizator.
Existฤ 2 paศi principali care trebuie efectuati pentru rutarea HTML5.
- Se configureazฤ $locationProvider
- Stabilirea bazei noastre pentru link-uri relative
Sฤ analizฤm รฎn detaliu cum se efectueazฤ paศii menศionaศi mai sus รฎn exemplul nostru.
Pas 1) Adฤugaศi codul relevant รฎn modulul Angular.
- Adauga o
<base>etichetฤ la antetul documentului. Acest lucru este necesar pentru rutarea HTML5, astfel รฎncรขt aplicaศia sฤ ศtie care este locaศia de bazฤ a aplicaศiei. - Adฤugaศi serviciul $locationProvider. Acest serviciu vฤ permite sฤ definiศi modul html5Mode.
- Setaศi html5Mode al serviciului $locationProvider la true.
Pas 2) Eliminaศi toate etichetele # pentru linkuri (โAngular/1โ, โAngular/2โ, โAngular/3โ) pentru a crea elemente uศor de citit. URLs.
<!-- In the head: required by html5Mode so relative templates resolve --> <base href="/"> <!-- In the body: the # is dropped from every link --> <a href="Angular/1">Topic details</a> <script> sampleApp.config(['$routeProvider', '$locationProvider', function($routeProvider, $locationProvider) { $locationProvider.html5Mode(true); $routeProvider. when('/Angular/:topicId', { templateUrl: 'Angular.html', controller: 'AngularController' }); }]); </script>
โ ๏ธ Corecลฃie: originalul a declarat un baseUrl constantฤ care indicฤ o cale IDE localฤ, ceea ce nu are niciun efect asupra html5Mode. AngularJS citeศte locaศia de bazฤ din <base href> etichetฤ. Originalul a fost injectat ศi $locationProvider fฤrฤ sฤ sun vreodatฤ html5Mode(true), deci hash-ul nu a fost niciodatฤ eliminat.
Dacฤ codul este executat cu succes, urmฤtorul rezultat va fi afiศat atunci cรขnd rulaศi codul รฎn browser.
ieศire:
Din ieศire,
- Puteศi vedea cฤ eticheta # nu este acolo cรขnd accesaศi aplicaศia.
Tot ce este menศionat mai sus foloseศte ngRoute, ruterul livrat de echipa AngularJS. Nu este singura opศiune, iar comparaศia de mai jos explicฤ cรขnd alternativa este cea mai potrivitฤ.
ngRoute vs ui-router: Ce router sฤ alegeศi
ngRoute este รฎntreศinut de echipa AngularJS ศi se potriveศte cu un URL direct cฤtre un singur ศablon ศi controler. ui-router este un proiect comunitar construit pentru a elimina principala limitare a ngRoute: se potriveศte la nivel de aplicaศie de stat mai degrabฤ decรขt pe URL singur, ceea ce permite ca un ecran sฤ conศinฤ mai multe regiuni rutate independent.
| Aspect | ngRoute | router interfaศฤ utilizator |
|---|---|---|
| Serviciu de configurare | $routeProvider | Furnizor de $state |
| Meciuri pe | URL | Statul numit, URL facultativ |
| Vizualizฤri imbricate | Nu este suportat | Suportat |
| Vizualizฤri multiple pe ecran | O singurฤ vizualizare ng | Multe puncte de vรขnzare cu ui-view denumite |
| Rezolvare imbricatฤ | Nu este suportat | Stฤrile fiului moศtenesc rezolvฤrile pฤrintelui |
| Cel mai potrivit pentru | Aplicaศii plate, mici | Tablouri de bord ศi machete stratificate |
Alegeศi ngRoute cรขnd fiecare URL se mapeazฤ la o singurฤ vizualizare pe paginฤ รฎntreagฤ, deoarece nu necesitฤ dependenศe suplimentare ศi รฎntregul API se potriveศte pe o singurฤ paginฤ. Alegeศi ui-router atunci cรขnd un ecran are panouri care navigheazฤ independent sau cรขnd vizualizฤrile copil trebuie sฤ reutilizeze datele รฎncฤrcate de un pฤrinte. Migrarea ulterioarฤ este posibilฤ, dar nu trivialฤ, deoarece numele stฤrilor รฎnlocuiesc URL modele รฎn toate ศabloanele.
Erori comune de rutare AngularJS ศi cum sฤ le remediaศi
Majoritatea erorilor de rutare produc o eroare ng-view goalฤ รฎn loc de o eroare de consolฤ, ceea ce le face mai greu de diagnosticat decรขt ar trebui. Fiecare simptom de mai jos รฎศi numeศte cauza ศi remedierea.
- Furnizor necunoscut: $routeProvider: angular-route.js nu a fost niciodatฤ รฎncฤrcat sau a fost รฎncฤrcat รฎnainte de angular.min.js. Referinศa cฤtre biblioteca principalฤ este mai รฎntรขi necesarฤ.
- Vizualizarea rฤmรขne goalฤ fฤrฤ erori: niciun element nu poartฤ directiva ng-view, deci ศablonul nu are unde sฤ fie randat.
- Nimic nu se รฎncarcฤ la prima vizitฤ: Nicio rutฤ nu se potriveศte cu calea goalฤ. Adฤugaศi un bloc otherwise cu o valoare redirectTo.
- `$routeParams` este gol: ศablonului รฎi lipseศte caracterul substituent pentru douฤ puncte. Trebuie sฤ fie โ/Angular/:topicIdโ.
- ศabloane 404 dupฤ html5Mode: configuraศi serverul sฤ rescrie cฤile nepotrivite cฤtre pagina de bazฤ ศi confirmaศi cฤ eticheta href de bazฤ este prezentฤ.
- Controlerul nu porneศte niciodatฤ din nou: doar parametrul s-a modificat, aศa cฤ AngularJS a reutilizat instanศa controlerului รฎn loc sฤ o reconstruiascฤ. Ascultaศi evenimentul $routeUpdate รฎn loc sฤ vฤ bazaศi pe declanศarea din nou a funcศiei controlerului.
























