2014-03-02 9 views
14

ich bin einfach dies zu tun Einstellung:Angular js - prüfen, ob aktuelle URL die Route übereinstimmt (mit dynamischer URL params)

app.config(['$routeProvider',function($routeProvider) { 
    $routeProvider 
    .when('/asd/:id/:slug',{ 
    templateUrl:'views/home/index.html', 
    controller:'Home', 
    publicAccess:true, 
    sessionAccess:true 
    }); 

: id und: Slug sind dynamisch params.

Nun möchte Ich mag diesen Weg check if current url matches (/asd/:id/:slug)

zum Beispiel der URL: asd/5/it-is-a-slug

was der einfachste Weg ist?

i tryed diese:

$rootScope.$on('$routeChangeStart', function(){ 
    console.log($route.current); 
}); 

aber manchmal gibt es nichts in der Konsole, während Seite Routen Schalt

+1

Sie könnten $ route-Service in Ihren Controller injizieren und '$ route.current' prüfen, um die aktuelle Route zu erhalten. Sie müssen die URL nicht zuordnen. –

+0

Sie meinen in der Home-Controller, weil mehrere Routen zugeordnet werden könnten? Wie @KhanhTO sagte, injiziere $ route und überprüfe $ route.current.params oder was auch immer. Obwohl ich denke, dass Ihr Code mehr darauf achten sollte, ob Sie Params haben, als ob die URL übereinstimmt. Wenn völlig unterschiedliche URLs mit unterschiedlichen Bedeutungen den gleichen Controller treffen, sollten Sie wahrscheinlich einen anderen Controller verwenden. –

+0

@EmersonFarrugia ich kann eigentlich nicht verstehen, warum es nicht auf jedem routeChangeStart funktioniert es scheint manchmal $ route.current ist nicht verfügbar – sbaaaang

Antwort

25

Die aktuelle Route ermöglicht die Verwendung von regulären Ausdrücken. Inject $route Service und erkunden Sie aktuelle Route Objekt. Nämlich regexp Teil:

$route.current.regexp 

Dies ist, wie Sie es (zB aus Controller-Methode zu prüfen, ob aktuellen Menüpunkt (die dynamischen Teile hat) soll aktiviert werden) verwenden können:

$scope.isActive = function (path) { 
    if ($route.current && $route.current.regexp) { 
     return $route.current.regexp.test(path); 
    } 
    return false; 
}; 
+0

Warum auf der ersten Seite laden die $ route.current scheint nicht verfügbar? Beim ersten Durchsuchen einer Seite erscheint es dann verfügbar – sbaaaang

+0

Ich denke, es hängt damit zusammen, wie Digest-Zyklus funktioniert. Es muss den Ausdruck mindestens zweimal evaluieren, um zu wissen, dass sich der Ausdruck geändert hat. – dfsq

1

Sie so etwas wie dies versuchen:

$routeProvider.when('/asd/:id/:slug', { 
    templateUrl: '/views/template.html', 
    controller: 'YourController', 
    resolve: { 
     data: ['$route', 'SecurityFactory', 
     function ($route, SecurityFactory) { 

      var id= parseInt($route.current.params.id, 10); 
      var slug= $route.current.params.slug; 

      SecurityFactory.checkParams(id, slug); 
     } 
     ] 
    } 
    }); 

dann innerhalb der SecurityFactory Sie können die Gültigkeit der Parameter überprüfen. Zum Beispiel mit RegExp.

+0

warum auf der ersten seite laden die $ route.current scheint nicht verfügbar? während beim ersten Browsen einer Seite erscheint dann verfügbar – sbaaaang

0

Nicht sehr elegante Lösung, und ich habe es getestet nur in Chrome DevTools, aber es scheint zu funktionieren:

Object.getPrototypeOf($route.current) === $route.routes['/asd/:id/:slug']; 

es scheint, dass die Routen Eigenschaft des $ Routen-Service ist ein Objektliteral mit den Tasten auf die Muster für jede Route eingestellt.

Für andere, die dies verwenden möchten, ersetzen Sie einfach '/asd/:id/:slug' durch das Muster, das Sie bei der Definition Ihrer Route verwendet haben.

Auch wenn Sie den otherwise Pfad übereinstimmen soll, verwenden Sie einfach $route.routes['null']

Haftungsausschluss: Dies ist nur eine Abhilfe, die ich gefunden und die für mich funktioniert. Da dieses Verhalten nicht dokumentiert ist und ich es nicht getestet habe, um zu sehen, ob es in allen Szenarien funktioniert, verwende es auf eigene Gefahr.

Verwandte Themen