2013-05-19 29 views
17

我在角JS有一個「路線」與它的偉大工程,除非:fooId組件包含'/'或'%2F'(編碼形式)

如何使這項工作,我的'fooId'可以包含/ s?

+0

你目前不能..查看http://stackoverflow.com/a/12685266/158502 - 如果你喜歡,你可以像這樣破解它:http://stackoverflow.com/a/16600968/158502 – Langdon

+0

但是/編碼,我不創建嵌套組件。只有一個組件 - 可能包含%2F。如果這不起作用,它就像是一個錯誤,不是? – ConfusedNoob

+0

沒錯,但它是urlencoded ...所以當你點擊鏈接到url的鏈接時,它會去unncode。我只注意到你實際上可以對它進行雙重編碼,最後在'$ route.current.params'中以%2F結尾,你必須自己解碼。使用'%252F'。 – Langdon

回答

12

你不能輕易做到這一點,因爲如果你在其中使用了一個帶有%2F的鏈接,瀏覽器將會爲你解碼它,它將最終成爲/。 AngularJS目前不允許您在$route params中使用/

您可以雙擊編碼它,就像這個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: '/'}); 

}); 

和鏈接爲:<a href="#/dir/a%252Fb%252Fc">click here</a>

另一種選擇,如果你已經在你的參數/字符集數可以在這裏找到:How can I make the angular.js route the long path

+2

我必須手動進行雙重編碼和重新編碼: 函數encodeSlash(uri){ \t return uri.replace(/ \ // g,'%252F')。replace(/%2F/gi,'%252F 「); } function decodeSlash(uri){ \t return uri.replace(/%2F/gi,「/」); } 這些都用於寫入$位置或閱讀(例如從$ routeParams),但它很好用,謝謝! – ConfusedNoob

+0

是否有任何方法來解決Angular 2中的問題? – higunjan

5

基於蘭登的答案,我創建了一個過濾器的所有內容進行了兩次,而另一個用於解碼:

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

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

我在產品鏈接使用如下:

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

在PR我解碼產品名稱:

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

你不需要在這裏編碼任何東西。只需在您的路徑帕拉姆添加*如下所述,使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

適合我。這應該是我認爲的答案。 – MarzSocks

1

包括 $ locationProvider.hashPrefix( ''); 在您的配置。

+2

爲什麼OP「包含$ locationProvider.hashPrefix(''); ...」?一個好的答案**將總是解釋所做的事情以及爲什麼這樣做,不僅是爲了OP,而且是爲了將來SO的訪問者。 –

相關問題