Sử dụng $ window hoặc $ location để Chuyển hướng trong AngularJS


90

Ứng dụng tôi đang làm việc chứa nhiều trạng thái khác nhau (sử dụng ui-router), trong đó một số trạng thái yêu cầu bạn đăng nhập, những trạng thái khác thì có sẵn công khai.

Tôi đã tạo một phương pháp kiểm tra hợp lệ xem người dùng đã đăng nhập hay chưa, những gì tôi hiện đang gặp vấn đề đang thực sự chuyển hướng đến trang đăng nhập của chúng tôi khi cần thiết. Cần lưu ý rằng trang đăng nhập hiện không được đặt trong ứng dụng 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 hiển thị đúng url dự định. Dòng sau đó, tôi đã thử thực tế mọi thứ từ $ window.open đến window.location.href và không có vấn đề gì tôi đã thử, không có chuyển hướng nào xảy ra.

CHỈNH SỬA (ĐÃ GIẢI QUYẾT):

Đã tìm thấy sự cố.

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

Biến landingUrl được đặt thành 'domain.com/login', sẽ không hoạt động với $ window.location.href (đó là một trong những thứ tôi đã thử). Tuy nhiên sau khi đổi mã thành

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

nó bây giờ hoạt động.


Có lẽ nên nói thêm rằng có xác thực phía máy chủ trên dữ liệu, vì vậy ở trên không phải là xác thực duy nhất, nó là vấn đề thuận tiện hơn để chuyển hướng đến trang đăng nhập, thay vì hiển thị một trang hầu như trống.
Thorbjørn Kappel Hansen

1
bạn cần locationđối tượng gốc bằng cách sử dụng$window.location=...
charlietfl

Thay vào đó, bạn có thể cân nhắc để biến tất cả thành AngularJS bao gồm xác thực của bạn - xem bài đăng này frederiknakstad.com/2013/01/21/…
Soren

Kế hoạch là cuối cùng sẽ đưa mọi thứ (bao gồm cả đăng nhập) vào bên trong ứng dụng AngularJS, nhưng vì chúng tôi hiện đang thực hiện chuyển đổi sang AngularJS, màn hình đăng ký / đăng nhập dường như là ít quan trọng nhất ở giai đoạn này.
Thorbjørn Kappel Hansen,

Câu trả lời:


81

Tôi tin rằng cách để làm điều này là $location.url('/RouteTo/Login');

Chỉnh sửa cho rõ ràng

Giả sử tuyến đường của tôi cho chế độ xem đăng nhập của tôi là /Login, tôi sẽ nói $location.url('/Login')điều hướng đến tuyến đường đó.

Đối với các vị trí bên ngoài ứng dụng Angular (tức là không có tuyến đường nào được xác định), JavaScript cũ thuần túy sẽ phân phát:

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

Chỉ cần thử điều đó. Thật không may, điều đó chuyển hướng đến www.domain.com/app/RouteTo/login thay vì www.domain.com/login
Thorbjørn Kappel Hansen

Đúng, điều đó không có nghĩa là theo nghĩa đen. Tôi không biết những gì bạn đã xác định làm lộ trình cho chế độ xem đăng nhập của bạn. Đặt bất cứ thứ gì mà tuyến đường đó có thể là đối số cho phương thức $ location.url (). Tôi đã chỉnh sửa câu trả lời cho rõ ràng.
m.casey

À đúng rồi. Vấn đề ở đây là $ location.url vẫn chuyển hướng đến một đường dẫn phụ của ứng dụng. Vì vậy, sử dụng $ location.url ( '/ login') chuyển hướng đến www.domain.com/app/login hơn www.domain.com/login
Thorbjørn Kappel Hansen

1
Vâng, như đã nêu trong câu hỏi, hiện tại trang đăng nhập nằm bên ngoài ứng dụng AngularJS. Do đó, cần phải chuyển hướng đến www.domain.com/login thay vì một đường dẫn trong ứng dụng.
Thorbjørn Kappel Hansen

5
Nó cũng đáng nói có lẽ bạn nên sử dụng $windowthay vì window(nguồn: stackoverflow.com/questions/28906180/... )
Caleb Faruki

39

Có vẻ như tải lại toàn trang $window.location.hreflà cách được ưu tiên.

Nó không gây ra tải lại toàn trang khi URL trình duyệt được thay đổi. Để tải lại trang sau khi thay đổi URL, hãy sử dụng API cấp thấp hơn, $ window.location.href.

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


19

Nó có thể giúp bạn! bản giới thiệu

Mẫu mã 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;
    };
});

Mẫu mã HTML

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

3

Không chắc từ phiên bản nào, nhưng tôi sử dụng 1.3.14 và bạn chỉ có thể sử dụng:

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

Không cần chèn $locationhoặc $windowtrong bộ điều khiển và không cần lấy địa chỉ máy chủ hiện tại.


-11

Bạn phải đặt:

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

Bằng cách này, hàm góc có thể truy cập vào đối tượng "cửa sổ"


Đừng sợ!
Mika
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.