AngularJS'de Yeniden Yönlendirmek için $ window veya $ location kullanma


90

Üzerinde çalıştığım uygulama çeşitli durumlar (ui-yönlendirici kullanarak) içeriyor, burada bazı durumlar oturum açmanızı gerektiriyor, diğerleri herkese açık.

Bir kullanıcının giriş yapıp yapmadığını geçerli bir şekilde kontrol eden bir yöntem oluşturdum, şu anda sorun yaşıyorum aslında gerektiğinde giriş sayfamıza yönlendiriliyor. Oturum açma sayfasının şu anda AngularJS uygulamasına yerleştirilmediğine dikkat edilmelidir.

app.run(function ($rootScope, $location, $window) {


    $rootScope.$on('$stateChangeStart', function (event, toState, toParams, fromState, fromParams) {

        if (toState.data.loginReq && !$rootScope.me.loggedIn) {
            var landingUrl = $window.location.host + "/login";
            console.log(landingUrl);
            $window.open(landingUrl, "_self");
        }
    });
});

Console.log, amaçlanan url'yi doğru bir şekilde gösterir. Bundan sonraki satır, $ window.open'dan window.location.href'e kadar neredeyse her şeyi denedim ve ne denersem deneyeyim yeniden yönlendirme olmuyor.

DÜZENLEME (ÇÖZÜLDÜ):

Sorunu buldum.

var landingUrl = $window.location.host + "/login";
$window.open(landingUrl, "_self");

LandingUrl değişkeni, $ window.location.href ile çalışmayan 'domain.com/login' olarak ayarlandı (denediğim şeylerden biriydi). Ancak kodu şu şekilde değiştirdikten sonra

var landingUrl = "http://" + $window.location.host + "/login";
$window.location.href = landingUrl;

şimdi çalışıyor.


Muhtemelen verilerde sunucu tarafı kimlik doğrulaması olduğunu da eklemelisiniz, bu nedenle yukarıdaki tek kimlik doğrulama değildir, çoğunlukla boş bir sayfa göstermek yerine oturum açma sayfasına yeniden yönlendirmek daha kolay bir konudur.
Thorbjørn Kappel Hansen

1
yerel locationnesneye ihtiyacınız var$window.location=...
charlietfl

Bunun yerine, kimlik doğrulamanız dahil olmak üzere hepsini bir AngularJS yapmayı düşünebilirsiniz - bu gönderiye bakın frederiknakstad.com/2013/01/21/…
Soren

Plan, sonunda AngularJS uygulamasına her şeyi (giriş dahil) dahil etmektir, ancak şu anda AngularJS'ye geçiş yaptığımız için, kayıt / giriş ekranı bu aşamada en az önemli gibi görünüyor.
Thorbjørn Kappel Hansen

Yanıtlar:


82

Bunu yapmanın yolunun $location.url('/RouteTo/Login');

Netlik için Düzenle

Giriş görünümüm için rotamın, o rotaya gitmeyi /Loginsöyleyebilirim $location.url('/Login').

Angular uygulamasının dışındaki konumlar için (yani hiçbir yol tanımlanmamış), düz eski JavaScript şunları sunacaktır:

window.location = "http://www.my-domain.com/login"

Bunu denedim. Maalesef bu, www.domain.com/login yerine www.domain.com/app/RouteTo/login adresine yönlendiriyor
Thorbjørn Kappel Hansen

Doğru, bu gerçek anlamına gelmiyordu. Giriş görünümünüz için rota olarak neyi tanımladığınızı bilmiyorum. $ Location.url () yönteminin bağımsız değişkenine bu yol ne olursa olsun yerleştirin. Netlik sağlamak için cevabı düzenledim.
m.casey

Ah doğru. Buradaki sorun, $ location.url'nin hala uygulamanın bir alt yoluna yönlendirmesidir. Dolayısıyla, $ location.url ['/ login') kullanılması www.domain.com/login yerine www.domain.com/app/login adresine yönlendiriyor
Thorbjørn Kappel Hansen

1
Peki, soruda belirtildiği gibi, şu anda giriş sayfası AngularJS uygulamasının dışında bulunuyor. Bu nedenle, uygulama içindeki bir yol yerine www.domain.com/login adresine yeniden yönlendirme ihtiyacı vardır.
Thorbjørn Kappel Hansen

5
Ayrıca (kaynak: stackoverflow.com/questions/28906180/… ) $windowyerine kullanmanız gerektiğini de belirtmekte fayda varwindow
Caleb Faruki

39

Görünüşe göre tam sayfa yeniden yükleme $window.location.hrefiçin tercih edilen yoldur.

Tarayıcı URL'si değiştirildiğinde tam sayfanın yeniden yüklenmesine neden olmaz. URL'yi değiştirdikten sonra sayfayı yeniden yüklemek için, daha düşük düzeydeki $ window.location.href API'sini kullanın.

https://docs.angularjs.org/guide/$location


19

Size yardımcı olabilir! demo

AngularJs Kod örneği

var app = angular.module('urlApp', []);
app.controller('urlCtrl', function ($scope, $log, $window) {
    $scope.ClickMeToRedirect = function () {
        var url = "http://" + $window.location.host + "/Account/Login";
        $log.log(url);
        $window.location.href = url;
    };
});

HTML Kod örneği

<div ng-app="urlApp">
    <div ng-controller="urlCtrl">
        Redirect to <a href="#" ng-click="ClickMeToRedirect()">Click Me!</a>
    </div>
</div>

4

Hangi sürümden emin değilim, ama ben 1.3.14 kullanıyorum ve sadece şunları kullanabilirsiniz:

window.location.href = '/employee/1';

Enjekte etmeye $locationveya $windowdenetleyiciye gerek yok ve mevcut ana bilgisayar adresini almaya gerek yok.


-11

Koymalısın:

< html ng-app = "urlApp" ng-controller = "urlCtrl">

Bu şekilde açısal işlev "pencere" nesnesine erişebilir


Korkmayın!
Mika
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.