2013-05-19 7 views
17

ich einen 'Weg' in Angular JS haben alsAngular JS 'route' entspricht nicht Komponente mit% 2F (codiert '/')

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

folgt und es funktioniert super, es sei denn, die: fooId Komponente enthält entweder ein '/' oder '% 2F' (codiertes Formular)

Wie kann ich das machen, meine 'fooId' kann/s enthalten?

+0

Sie können derzeit nicht .. http://Stackoverflow.com/a/12685266/158502 - Sie können es hacken wie folgt, wenn Sie möchten: http://StackOverflow.com/a/16600968/158502 – Langdon

+0

aber das/ist codiert, ich erstelle keine verschachtelten Komponenten. Nur eine Komponente - das könnte ein% 2F enthalten. Wenn das nicht funktioniert, scheint es ein Fehler zu sein, oder? – ConfusedNoob

+0

Richtig, aber es ist urlencoded ... also, wenn Sie auf den Link klicken, der an die URL gebunden ist, wird es zu unencode gehen. Ich habe gerade bemerkt, dass du es tatsächlich doppelt kodieren kannst und am Ende mit% 2F in '$ route.current.params' enden wirst, das du selbst entschlüsseln musst. Verwende '% 252F'. – Langdon

Antwort

12

Sie können nicht so leicht, weil tun, wenn Sie einen Link mit %2F darin verwenden, wird der Browser für Sie entschlüsseln es gerade und es wird sein / enden. AngularJS erlaubt derzeit nicht, / in $route params zu verwenden.

Sie können es doppelt kodieren, wie in diesem 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: '/'}); 

}); 

Und der Link wäre: <a href="#/dir/a%252Fb%252Fc">click here</a>.

Eine weitere Option, wenn Sie eine bestimmte Anzahl von / Zeichen haben, kann in Ihren Parametern hier: How can I make the angular.js route the long path

+2

Ich musste manuell doppelt codieren und neu codieren: Funktion encodeSlash (uri) { \t Rückgabe uri.replace (/ \ // g, '% 252F'). Ersetzen (/% 2F/gi, '% 252F "); } Funktion decodeSlash (uri) { \t Rückgabe uri.replace (/% 2F/gi, "/"); } Diese werden verwendet, wenn Sie in den $ Standort schreiben oder lesen (z. B. von $ routeParams), aber es funktioniert super, danke! – ConfusedNoob

+0

Ist das eine Möglichkeit, das Problem in Angular 2 zu lösen? – higunjan

5

Basierend auf der Antwort von Langdon, ich einen Filter erstellt, der alles zweimal, und ein anderes codiert, das decodiert :

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

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

ich benutze diese Links in meinem Produkt wie folgt:

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

auf der pr oduct Seite, ich decode den Produktnamen:

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

Sie müssen hier nichts codieren. Fügen Sie einfach * in Ihrem Pfad Param, wie unten erwähnt und ermöglichen 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

Funktioniert für mich. Dies sollte meiner Meinung nach die Antwort sein. – MarzSocks

1

umfassen $ locationProvider.hashPrefix (''); in Ihrer Konfiguration.

+2

Warum sollte das OP "$ locationProvider.hashPrefix (''); ..." enthalten?Eine ** gute Antwort ** wird immer eine Erklärung haben, was getan wurde und warum es so gemacht wurde, nicht nur für das OP, sondern auch für zukünftige Besucher von SO. –

Verwandte Themen