2013-10-11 13 views
35

के बाहर के मार्गों पर रीडायरेक्ट करने के लिए $ मार्ग प्रदाता का उपयोग करना मैंने अंगुलर में एक वेब अनुप्रयोग का हिस्सा लिखा है। यह सुनिश्चित करने के लिए कि सभी मार्ग शामिल हैं, मैं संपत्ति को $routeProvider पर जोड़ना चाहता था, ताकि अवैध मार्ग वेब एप्लिकेशन की जड़ पर वापस आ जाए, जो कोणीय का उपयोग नहीं करता है।अंगुलर

मैंने कोशिश की:

$routeProvider.otherwise({ 
    redirectTo: '/' 
}); 

लेकिन स्पष्ट रूप से URL के कोणीय नियंत्रित हिस्से में यह केवल मार्गों,, http://app.com, जहां मैं उन्हें करना चाहते हैं के बजाय तो उन http://app.com/angular-part-of-web-app# जैसी URL पर पुनः निर्देशित किया जाएगा चले जाओ।

मैं इस के चारों ओर एक खाली आंशिक '404' पृष्ठ के रूप में कार्य करने के लिए, और फिर एक नियंत्रक जो सिर्फ $window ऑब्जेक्ट का उपयोग करता वांछित पृष्ठ पर रीडायरेक्ट करने के द्वारा काम किया है:

routes.js

// Redirect to site list. 
$routeProvider.when('/404', { 
    templateUrl: '/partials/404.html', 
    controller: 'RedirectCtrl' 
}); 

// Redirect to the 404 page. 
$routeProvider.otherwise({ 
    redirectTo: '/404' 
}); 

controllers.js

// Controller to redirect users to root page of site. 
.controller('RedirectCtrl', ['$scope', '$window', function ($scope, $window) { 

    $window.location.href = '/'; 
}]); 

हालांकि, यह 'बहुत हैकी बंद कर रहा है, एक बेहतर तरीका होना चाहिए' अलार्म घंटी। क्या कोणीय में ऐसा करने का कोई बेहतर तरीका है?

संपादित करें: Angular routes - redirecting to an external site? एक ही प्रश्न का उत्तर नहीं मिला। मैं इसे एक डुप्लिकेट (अब के लिए) के रूप में चिह्नित करने के बजाय अपना प्रश्न खोलने जा रहा हूं, क्योंकि कोणीय दुनिया इतनी तेजी से आगे बढ़ रही है, पिछला उत्तर अब मामला नहीं हो सकता है।

+2

शायद इसे चीजों के सर्वर-पक्ष पर संभाल लें। – tymeJV

+2

मैं इसे हल करने के लिए भी देख रहा हूं। मैं अपने ऐप को कोणीय में बदलने की प्रक्रिया में हूं और कुछ हिस्सों को अभी भी सर्वर से परोसा जाता हूं। कोणीय भाग और गैर-कोणीय भाग – Michael

उत्तर

41

उपरोक्त समाधान/404 मेरे साथ काम नहीं करता है। हालांकि यह काम करने के लिए

.otherwise({ 
    controller : function(){ 
     window.location.replace('/'); 
    }, 
    template : "<div></div>" 
}); 

पुनश्च लगता है। मैं कोणीय 1.2.10

+4

मैं कोणीय 1.2 का भी उपयोग कर रहा हूं और स्वीकृत उत्तर काम नहीं किया लेकिन यह एक किया। टेम्पलेट भी आवश्यक था। – Chadwick

+0

यदि आपको अपने डोमेन की जड़ के बजाय कहीं और नेविगेट करने की आवश्यकता है तो आपको 'window.location' विधि का उपयोग करने के कारण हैश' # ','/'और' या '' 'एंकर नामों की आवश्यकता हो सकती है। –

19

आप कुछ इस तरह कर सकता है:

$routeProvider.when('/404', { 
    controller: ['$location', function($location){ 
     $location.replace('/'); 
    }] 
}).otherwise({ 
    redirectTo: '/404' 
}); 

यह मूलतः एक ही बात है, केवल यह कम कोड का उपयोग करता है।

+1

के बीच कनेक्ट करने का एक तरीका ढूंढने की आवश्यकता है, मुझे नहीं पता था कि नियंत्रकों को इनलाइन घोषित किया जा सकता है। यह बहुत अच्छा है, धन्यवाद! – surfitscrollit

18

सुनिश्चित नहीं कर रहा हूं कि कोणीय जेएस का स्वीकार्य उत्तर किस संस्करण पर लिखा गया था, लेकिन 'रीडायरेक्ट करने के लिए' संपत्ति एक समारोह में होती है। तो, इस तरह कुछ आसान क्यों न करें:

$routeProvider.otherwise({ 
    redirectTo: function() { 
     window.location = "/404.html"; 
    } 
}); 

जाहिर है, आपको अपना स्वयं का 404.html बनाना है। या जहां भी आपका 404 पृष्ठ है।

+1

रीडायरेक्ट के लिए वर्तमान पथ को आप कैसे कार्य करते हैं? –

+0

आप जावास्क्रिप्ट में 'document.URL' – stack247

+0

दस्तावेज़ के साथ वर्तमान यूआरएल प्राप्त कर सकते हैं document.location.pathname शायद पथ –

5

चिह्नित उत्तरों सहित कोई भी जवाब मेरे लिए काम नहीं करता है। मेरा मानना ​​है कि मेरा समाधान आपकी समस्या को हल करता है और मैं भविष्य में पाठकों के संदर्भ के लिए भी अपना उपयोग-मामला साझा करता हूं। मार्ग नियंत्रक विधि का उपयोग कर के साथ

मुद्दा: जब नियंत्रक पहले से ही मार्ग भरी हुई मेरे लिए इतिहास API राज्यों को एक्सेस किया है है (मैं एचटीएमएल 5 मोड का उपयोग करें, यकीन नहीं इस गैर एचटीएमएल 5 मोड को प्रभावित करता है या नहीं)।

नतीजतन, भले ही मैं लोगों को विंडो.लोकेशन का उपयोग करके सही पृष्ठ पर अग्रेषित कर सकूं।प्रतिस्थापित करें ('/'); यदि उपयोगकर्ता उसके ब्राउज़र पर वापस क्लिक करता है, तो यह अमान्य स्थिति पर जाता है।

परिदृश्य: हम बहु पृष्ठ मॉडल को लागू करते हैं और मेरे पास मेरे होम पेज (गैर-व्यवस्थापक) मॉड्यूल से मेरा व्यवस्थापक पृष्ठ मॉड्यूल अलग है। मेरे पास मेरे व्यवस्थापक नियंत्रक में से कहीं भी $ location.path ('/') है, लेकिन चूंकि होमपेज व्यवस्थापक पृष्ठ मॉड्यूल में पैक नहीं किया गया है, इसलिए जब मैं '/' मार्ग का पता लगाता हूं तो मैं पूर्ण पृष्ठ रीलोड को मजबूर करना चाहता हूं।

समाधान: हम $ routeChangeStart पर अवरोधन करने से पहले ngRoute राज्य की जानकारी से किसी को ऐक्सेस कर सकते है। इस तरह हम भी $ मार्ग

angular.module('app',['ngRoute']) 
.config(['$routeProvider', function($routeProvider) { 
    $routeProvider 
    .when('/admin/default', {template: somePageTemplate}) 
    /* 
    * More admin-related routes here... 
    */ 
    .when('/',{redirectTo:'/homepage'}) // <-- We want to intercept this 
    .otherwise({redirectTo: '/admin/default'}); 
}]) 
.controller('MainCtrl',[ // <- Use this controller outside of the ng-view! 
    '$rootScope','$window', 
    function($rootScope,$window){ 
    $rootScope.$on("$routeChangeStart", function (event, next, current) { 
     // next <- might not be set when first load 
     // next.$$route <- might not be set when routed through 'otherwise' 
     // You can use regex to match if you have more complexed path... 
     if (next && next.$$route && next.$$route.originalPath === '/') { 
     // Stops the ngRoute to proceed 
     event.preventDefault(); 
     // We have to do it async so that the route callback 
     // can be cleanly completed first, so $timeout works too 
     $rootScope.$evalAsync(function() { 
      // next.$$route.redirectTo would equal be '/homepage' 
      $window.location.href = next.$$route.redirectTo; 
     }); 
     } 
    }); 
    } 
]); 

रूप में मैं इस कोड का उपयोग किया जाएगा अपने आप को किसी भी प्रतिक्रिया दें में redirectTo परम करने के लिए यूआरएल पास करके बाहरी href निर्दिष्ट कर सकते हैं। चीयर्स

संदर्भ: https://github.com/angular/angular.js/issues/9607

1

हाय भले ही यह बस window.location.assign का उपयोग सिर्फ कुछ एक है जो इस जवाब के लिए खोज के लिए दो साल हो गया है,, ('/ लॉगिन')। यह मेरे लिए काम है।

+0

को रोकता है यह अच्छा लगता है - मैंने बस 'location.assign' और 'location.replace' के बीच का अंतर देखा और किसी के हित में कोई अच्छा जवाब मिला: http://stackoverflow.com/प्रश्न/4505798/अंतर-बीच-खिड़की-स्थान असाइन और खिड़की-स्थान-बदलें – surfitscrollit

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