2013-05-19 32 views
17

有する成分と一致しない角度JS「ルートは」%2F(「/」をコードする)

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

を次のようにIは、角JSの「ルート」を持っており、それはしない限り、素晴らしい作品:fooId成分'/'または '%2F'(エンコードされた形式)のいずれかを含む

私の 'fooId'には/ sを含めることができますか?

+0

現在、あなたはhttp://stackoverflow.com/a/12685266/158502を見ることができません。あなたが好きなら、このようにハックすることができます:http://stackoverflow.com/a/16600968/158502 – Langdon

+0

/がエンコードされている、私は入れ子にされたコンポーネントを作成していない。 1つのコンポーネント - %2Fが含まれている可能性があります。それがうまくいかない場合は、バグのように見えますか? – ConfusedNoob

+0

右ですが、URLにエンコードされています...そのURLに結びついているリンクをクリックすると、エンコードが解除されます。私はあなたが実際にそれを二重にエンコードすることができ、 '$ 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

私は手動で二重エンコードして再エンコードする必要がありました: function encodeSlash(uri){ \t return uri.replace(/ \ // g、 '%252F')。(/%2F/gi、 '%252F '); } function decodeSlash(uri){ \t return uri.replace(/%2F/gi、 "/"); } これらは$場所への書き込みや読み込み(たとえば$ routeParamsから)などの場合に使用されますが、効果があります。 – ConfusedNoob

+0

Angular 2の問題を解決する方法はありますか? – higunjan

5

を、私は二回、すべてを符号化し、フィルタ、およびデコードする別のものを作成しましたPRオン

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

を::次のように

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

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

私は、製品のリンクでこれを使用します商品ページのデコレーション:

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

ここでは何もエンコードする必要はありません。ただ、下に述べたように、あなたのパスのParamで*を追加し、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のためだけでなく、将来の訪問者のためにそうした方法で行われたのかについての説明をいつも持っています。 –