2015-01-25 7 views
30

Ich habe eine Anfrage, in einem anderen URL-Parameter hinzuzufügen, der zu einem Staat, den ich bereits eingerichtet habe, richtet. Aus Effizienzgründen versuche ich zu sehen, ob ich mehrere URLs hinzufügen kann, um auf denselben Status zu verweisen, oder ob ich einfach die $ UrlRouterProvider.when() -Methode verwenden soll, um in diesem neuen Fall an diesen Status zu verweisen.AngularJs UI-Router - ein Zustand mit mehreren URLs

Ex. Dieses ist bereits vorhanden

.state('site.link1', 
    { 
    url: '/link1', 
    templateUrl: '/views/link1.html', 
    controller: 'link1Ctrl' 
    }) 

und die Anfrage ist, www.site.com/newlink hinzuzufügen, die auf die Seite link1 zeigt. Gibt es so etwas?

.state('site.link1', 
    { 
    url: '/link1, /newlink', 
    ... 
+1

Momentan müssen Sie entweder .when oder define multimal mit verschiedenen URLs verwenden ... es gibt einige Möglichkeiten: http: // stackoverflow.com/a/23853129/1679310 –

+1

Wenn die einzige Änderung ist die stateParams können Sie mit der gleichen Route und nur vorbei, leere param, das einzige, was nicht so elegant ist, dass Sie ein "//" in Ihrem haben url. Wenn die Spezifikation eine völlig andere URL definiert, dann wird ein neuer Zustand benötigt. –

+0

Wenn 2 verschiedene Param-Werte auf denselben Status zu diesen verschiedenen ursl umleiten, dann können Sie templateurl als Funktion verwenden, wo Sie das erste Argument als routeparam erhalten und die URL entsprechend zurückgeben . aber es ist nicht ganz klar, was genau Sie vorhaben. – PSL

Antwort

14

Sie verwenden params:

https://github.com/angular-ui/ui-router/wiki/URL-Routing

.state('site.link', 
{ 
    url: '/{link}' 
    .. 
} 

so, wenn Sie den gleichen Zustand wie diese verwenden

$state.go('site.link', {link: 'link1'}) 
$state.go('site.link', {link: 'link2'}) 
+0

Ich bin neugierig, wo haben Sie ein solches Beispiel in dem von Ihnen bereitgestellten Link gesehen? – mpgn

+0

Der Link zeigt die Dokumentation und verwendet Kontakte. Ich benutze nur dieses Beispiel, um zu zeigen, wie man den Zustand mit der "go" -Funktion ändert. – Valter

7

Sie verwendete when() Funktion

.state('site.link1', 
    { 
    url: '/link1', 
    templateUrl: '/views/link1.html', 
    controller: 'link1Ctrl' 
    }) 

dann auf Root-Config

angular.module('myApp', [...]) 
    .config(function ($urlRouterProvider) { 
     $urlRouterProvider.when(/newlink/, ['$state','$match', function ($state, $match) { 
      $state.go('site.link1'); 
     }]); 
    }); 
0

ich fast das gleiche Problem hatte, nur mit einem anderen Zwang - ich wollte nicht eine Umleitung verwenden, da ich die URL im Browser wollte gleich bleiben, aber zeige den gleichen Zustand an.
Das war, weil ich wollte, dass die gespeicherten Chrom-Passwörter für Benutzer funktionieren, die bereits die vorherige URL gespeichert haben.

In meinem Fall wollte ich diese beiden URLs:
/gilly und
/new/gilly
sowohl auf den gleichen Zustand.

Ich löste dies, indem ich einen Zustand für /gilly definiert habe, und für die zweite URL habe ich einen abstrakten Zustand namens /new definiert.

Dies sollte nach oben wie folgt festgelegt werden:

$stateProvider.state('new', { 
    abstract: true, 
    url: '/new' 
    template: '', 
    controller: function() { } 
}).state('gilly', { 
    url: '/gilly', 
    template: 'gilly.html', 
    controller: 'GillyController' 
}).state('new.gilly', { 
    url: '/gilly', // don't add the '/new' prefix here! 
    template: 'gilly.html', 
    controller: 'GillyController' 
}); 
11

Versuchen Sie, die Regex und einen Parameter in der URL. Es ist nicht optimal, aber funktioniert.

.state('site.link1', 
{ 
    url: '/{path:link1|newlink}', 
    templateUrl: '/views/link1.html', 
    controller: 'link1Ctrl' 
}) 

weitere Informationen über regex in Urls http://angular-ui.github.io/ui-router/site/#/api/ui.router.util.type:UrlMatcher

Um

<a ui-sref="site.link1({path:'link1'})" >site link 1</a> 
<a ui-sref="site.link1({path:'newlink'})">site new link</a> 
4

ich diesen Ansatz Links mit ui-sref passieren die gleichen Parameter mit dem Staatsnamen als Funktion zu erzeugen gefunden ganz einfach zu sein und clean: Erzeuge zwei gleiche Zustände und verändere einfach die url Eigenschaft

//Both root and login are the same, but with different url's. 
var rootConfig = { 
    url: '/', 
    templateUrl:'html/authentication/login.html', 
    controller: 'authCtrl', 
    data: { 
     requireLogin: false 
    } 
} 

var loginConfig = Object.create(rootConfig) 
loginConfig.url = '/login' 

$stateProvider 
    .state('root', rootConfig) 
    .state('login', loginConfig) 
+2

Es definiert immer noch zwei Zustände, nur lesbarer. – 0xc0de

Verwandte Themen