2013-05-19 9 views
17

Ho un 'percorso' in angolare JS come segueangolare JS 'route' non corrisponde componente% 2F (codificato '/')

$routeProvider.when('/foos/:fooId', { controller: FooController, templateUrl: 'foo.html'}); 

e funziona benissimo, a meno che il: componente fooId contiene un '/' o '% 2F' (forma codificata)

Come posso fare questo lavoro, il mio 'fooId' può contenere/s?

+0

Al momento non è possibile ... vedere http://stackoverflow.com/a/12685266/158502 - È possibile modificarlo in questo modo, se lo si desidera: http://stackoverflow.com/a/16600968/158502 – Langdon

+0

ma il/è codificato, non sto creando componenti nidificati. Solo un componente, che potrebbe contenere un% 2F. Se questo non funziona, sembra un bug, no? – ConfusedNoob

+0

Giusto, ma è urlencoded ... quindi quando fai clic sul link che è legato all'url, il suo andare a unencode. Ho appena notato che in realtà puoi raddoppiare la codifica e finire con% 2F in '$ route.current.params' che dovrai decodificare da solo. Usa '% 252F'. – Langdon

risposta

12

Non è possibile farlo facilmente perché se si utilizza un collegamento con %2F in esso, il browser lo decodificherà per voi e finirà per essere /. Attualmente AngularJS non consente di utilizzare / nei parametri $route.

È possibile fare doppio codificare, come in questo plnkr: http://plnkr.co/edit/e04UMNQWkLRtoVOfD9b9?p=preview

var app = angular.module('app', []); 

app.controller('HomeCtrl', function ($scope, $route) { 
}); 
app.controller('DirCtrl', function ($scope, $route) { 
    var p = $route.current.params; 

    $scope.path = decodeURIComponent(p.p1); 
}); 

app.config(function ($routeProvider) { 
    $routeProvider 
      .when('/', {templateUrl: 'home.html', controller: 'HomeCtrl'}) 
     .when('/dir/:p1', {templateUrl: 'dir.html', controller: 'DirCtrl'}) 
      .otherwise({redirectTo: '/'}); 

}); 

E il link potrebbe essere: <a href="#/dir/a%252Fb%252Fc">click here</a>.

Un'altra opzione, se si dispone di un certo numero di / caratteri nei parametri può essere trovato qui: How can I make the angular.js route the long path

+2

Ho dovuto duplicare e ricodificare manualmente: function encodeSlash (uri) { \t return uri.replace (/ \ // g, '% 252F'). Replace (/% 2F/gi, '% 252F '); } function decodeSlash (uri) { \t return uri.replace (/% 2F/gi, "/"); } Questi vengono utilizzati ogni volta che si scrive sulla posizione $ o si legge (ad esempio da $ routeParams) ma funziona benissimo, grazie! – ConfusedNoob

+0

È questo un modo per risolvere il problema in Angular 2? – higunjan

5

Sulla base della risposta di Langdon, ho creato un filtro che codifica per tutto due volte, e un altro che decodifica :

.filter('escape', function() { 
     return function(input) { 
      return encodeURIComponent(encodeURIComponent(input)); 
     }; 
}) 

.filter('unescape', function() { 
     return function(input) { 
      return decodeURIComponent(input); 
     }; 
    }); 

ho usare questo nella mia link di prodotti come segue:

<a href="#/p/{{product.id}}/{{product.name | escape}}"> 

Sulla pr Pagina di oduzione, decodificare il nome del prodotto:

<h1>{{product.name | unescape}}</h1> 
4

Non è necessario codificare nulla qui. Basta aggiungere * nel tuo percorso Param come indicato di seguito e consentire html5Mode

app.config(function ($routeProvider, $locationProvider) { 
$routeProvider 
.when('/home', {templateUrl: 'home.html', controller: 'HomeCtrl'}) 
.when('/base/:path*', {templateUrl: 'path.html', controller: 'pathCtrl'}) 
.otherwise({redirectTo: '/home'}); 
}); 

$locationProvider.html5Mode({ 
    enabled: true, 
    requireBase: false 
}); 
+0

Funziona per me. Questa dovrebbe essere la risposta secondo me. – MarzSocks

1

includono $ locationProvider.hashPrefix (''); nella tua configurazione.

+2

Perché l'OP "include $ locationProvider.hashPrefix (''); ..."?Una ** buona risposta ** avrà sempre una spiegazione di cosa è stato fatto e perché è stato fatto in questo modo, non solo per l'OP ma per i futuri visitatori di SO. –

Problemi correlati