2013-05-19 9 views
17

मैं कोणीय जे एस में एक 'मार्ग' से मेल नहीं खाता और यह बहुत अच्छा काम करता है, जब तक कि: fooId घटक या तो '/' या '% 2F' (एन्कोडेड फॉर्म)कोणीय जे एस 'मार्ग'% 2F साथ घटक (इनकोडिंग '/')

मैं यह काम कैसे कर सकता हूं, मेरे 'fooId' में शामिल हो सकते हैं?

+0

आप वर्तमान में नहीं देख सकते हैं .. http://stackoverflow.com/a/12685266/158502 देखें - यदि आप चाहें तो आप इसे इस तरह से हैक कर सकते हैं: http://stackoverflow.com/a/16600968/158502 – Langdon

+0

लेकिन/एन्कोड किया गया है, मैं नेस्टेड घटक नहीं बना रहा हूँ। बस एक घटक - जिसमें% 2F हो सकता है। अगर यह काम नहीं करता है, तो यह एक बग की तरह लगता है, नहीं? – ConfusedNoob

+0

ठीक है, लेकिन यह urlencoded है ... तो जब आप यूआरएल से जुड़े लिंक पर क्लिक करते हैं, तो यह अनएकोड पर जा रहा है। मैंने अभी देखा है कि आप वास्तव में इसे एन्कोड कर सकते हैं, और '$ rout.current.params' में% 2F के साथ समाप्त हो सकते हैं, जिसे आपको स्वयं को डीकोड करना होगा। '% 252F' का प्रयोग करें। – Langdon

उत्तर

12

आप आसानी से ऐसा नहीं कर सकते हैं क्योंकि यदि आप %2F के साथ एक लिंक का उपयोग करते हैं, तो ब्राउज़र केवल आपके लिए इसे डीकोड करेगा और यह / होगा। AngularJS वर्तमान में $route पैराम्स में / का उपयोग करने की अनुमति नहीं देता है।

आप डबल यह सांकेतिक शब्दों में बदलना कर सकते हैं, इस 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

मुझे मैन्युअल रूप से एन्कोड और पुनः-एन्कोड करना था: फ़ंक्शन एन्कोड स्लैश (यूरी) { \t वापसी uri.replace (/ \ // g, '% 252F')। (% 2F/gi, '% 252F '); } फ़ंक्शन डिकोड स्लैश (uri) { \t वापसी uri.replace (/% 2F/gi, "/"); } इन्हें $ स्थान या पढ़ने के लिए लिखते समय उपयोग किया जाता है (उदा। $ रूट पैराम्स से) लेकिन यह बहुत अच्छा काम करता है, धन्यवाद! – ConfusedNoob

+0

क्या यह कोणीय 2 में समस्या को हल करने का कोई तरीका है? – higunjan

5

लैंगडन की जवाब के आधार पर, मैं एक फिल्टर जो सब कुछ दो बार encodes, और एक दूसरे से जो डीकोड बनाया :

.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}}"> 

जनसंपर्क पर oduct पेज, मैं उत्पाद का नाम डीकोड करता हूं:

<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

ओपी को "$ locationProvider.hashPrefix (''); ..." क्यों शामिल होना चाहिए?एक ** अच्छा उत्तर ** हमेशा क्या किया गया था इसका एक स्पष्टीकरण होगा और यह ओपी के लिए क्यों नहीं बल्कि भविष्य के आगंतुकों के लिए ऐसा किया गया था। –

संबंधित मुद्दे