Menggunakan $ window atau $ location untuk Redirect di AngularJS


90

Aplikasi yang saya kerjakan berisi berbagai status (menggunakan ui-router), di mana beberapa negara mengharuskan Anda untuk masuk, yang lain tersedia untuk umum.

Saya telah membuat metode yang secara valid memeriksa apakah pengguna masuk, apa yang saat ini saya alami adalah mengalihkan ke halaman masuk kami bila perlu. Perlu dicatat bahwa halaman login saat ini tidak ditempatkan di dalam aplikasi AngularJS.

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 menunjukkan url yang dimaksud dengan benar. Baris setelah itu, saya telah mencoba hampir semuanya dari $ window.open hingga window.location.href dan tidak peduli apa yang saya coba, tidak ada pengalihan yang terjadi.

EDIT (TERSELESAIKAN):

Menemukan masalahnya.

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

Variabel landingUrl disetel ke 'domain.com/login', yang tidak akan berfungsi dengan $ window.location.href (yang merupakan salah satu hal yang saya coba). Namun setelah mengubah kode menjadi

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

sekarang bekerja.


Mungkin harus menambahkan bahwa ada otentikasi sisi server pada data juga, jadi di atas bukan satu-satunya otentikasi, itu lebih merupakan masalah kenyamanan untuk mengarahkan ke halaman login, daripada menampilkan halaman yang sebagian besar kosong.
Thorbjørn Kappel Hansen

1
Anda memerlukan locationobjek asli menggunakan$window.location=...
charlietfl

Alih-alih Anda dapat mempertimbangkan untuk menjadikannya semua AngularJS termasuk otentikasi Anda - lihat posting ini frederiknakstad.com/2013/01/21/…
Soren

Rencananya adalah untuk memasukkan semuanya (termasuk login) di dalam aplikasi AngularJS pada akhirnya, tetapi karena kami saat ini melakukan transisi ke AngularJS, layar pendaftaran / login tampaknya menjadi yang paling tidak penting pada tahap ini.
Thorbjørn Kappel Hansen

Jawaban:


82

Saya percaya cara untuk melakukan ini adalah $location.url('/RouteTo/Login');

Edit untuk Kejelasan

Katakanlah rute saya untuk tampilan login saya adalah /Login, menurut saya $location.url('/Login')untuk menavigasi ke rute itu.

Untuk lokasi di luar aplikasi Angular (yaitu tidak ada rute yang ditentukan), JavaScript lama biasa akan melayani:

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

Coba saja. Sayangnya, itu dialihkan ke www.domain.com/app/RouteTo/login daripada www.domain.com/login
Thorbjørn Kappel Hansen

Benar, itu tidak berarti literal. Saya tidak tahu apa yang Anda tetapkan sebagai rute untuk tampilan login Anda. Tempatkan rute apa pun yang mungkin ada di argumen untuk metode $ location.url (). Saya telah mengedit jawaban untuk kejelasan.
m.casey

Ah benar. Masalahnya di sini adalah bahwa $ location.url masih mengalihkan ke sub-jalur aplikasi. Jadi menggunakan $ location.url ('/ login') dialihkan ke www.domain.com/app/login daripada www.domain.com/login
Thorbjørn Kappel Hansen

1
Nah, seperti yang dinyatakan dalam pertanyaan, saat ini halaman login berada di luar aplikasi AngularJS. Karenanya kebutuhan untuk mengarahkan ulang ke www.domain.com/login daripada jalur di dalam aplikasi.
Thorbjørn Kappel Hansen

5
Perlu juga disebutkan bahwa Anda mungkin harus menggunakan $windowalih-alih window(sumber: stackoverflow.com/questions/28906180/… )
Caleb Faruki

39

Tampaknya untuk memuat ulang halaman penuh $window.location.hrefadalah cara yang lebih disukai.

Itu tidak menyebabkan pemuatan ulang halaman penuh saat URL browser diubah. Untuk memuat ulang halaman setelah mengubah URL, gunakan API tingkat yang lebih rendah, $ window.location.href.

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


19

Ini mungkin membantu Anda! demo

Sampel Kode AngularJs

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;
    };
});

Contoh Kode HTML

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

3

Tidak yakin dari versi apa, tapi saya menggunakan 1.3.14 dan Anda bisa menggunakan:

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

Tidak perlu menyuntikkan $locationatau $windowdi pengontrol dan tidak perlu mendapatkan alamat host saat ini.


-11

Anda harus meletakkan:

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

Dengan cara ini fungsi sudut dapat mengakses objek "jendela"


Jangan takut!
Mika
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.