ใช้ $ window หรือ $ location เพื่อเปลี่ยนเส้นทางใน AngularJS


90

แอปที่ฉันใช้งานมีสถานะต่างๆ (โดยใช้ ui-router) ซึ่งบางรัฐกำหนดให้คุณต้องเข้าสู่ระบบส่วนสถานะอื่น ๆ จะเปิดเผยต่อสาธารณะ

ฉันได้สร้างวิธีการที่ตรวจสอบได้อย่างถูกต้องว่าผู้ใช้เข้าสู่ระบบหรือไม่สิ่งที่ฉันกำลังมีปัญหาคือการเปลี่ยนเส้นทางไปยังหน้าการเข้าสู่ระบบของเราเมื่อจำเป็น ควรสังเกตว่าขณะนี้หน้าล็อกอินไม่ได้อยู่ในแอป 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 แสดง url ที่ต้องการอย่างถูกต้อง บรรทัดหลังจากนั้นฉันได้ลองใช้งานจริงทุกอย่างตั้งแต่ $ window.open ไปจนถึง window.location.href และไม่ว่าฉันจะพยายามอย่างไรก็ไม่มีการเปลี่ยนเส้นทางเกิดขึ้น

แก้ไข (แก้ไขแล้ว):

พบปัญหา

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

LandingUrl ตัวแปรถูกตั้งค่าเป็น 'domain.com/login' ซึ่งใช้ไม่ได้กับ $ window.location.href (ซึ่งเป็นหนึ่งในสิ่งที่ฉันลอง) อย่างไรก็ตามหลังจากเปลี่ยนรหัสเป็น

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

ตอนนี้ใช้งานได้แล้ว


ควรเพิ่มว่ามีการตรวจสอบสิทธิ์ฝั่งเซิร์ฟเวอร์ในข้อมูลด้วยดังนั้นข้างต้นไม่ใช่การตรวจสอบความถูกต้องเพียงอย่างเดียวการเปลี่ยนเส้นทางไปยังหน้าการเข้าสู่ระบบเป็นเรื่องที่สะดวกกว่าแทนที่จะแสดงหน้าว่างเป็นส่วนใหญ่
Thorbjørn Kappel Hansen

1
คุณต้องการlocationวัตถุพื้นเมืองโดยใช้$window.location=...
charlietfl

แต่คุณสามารถพิจารณาที่จะทำให้มันเป็น AngularJS ทั้งหมดรวมถึงการรับรองความถูกต้องของคุณ - ดูโพสต์นี้frederiknakstad.com/2013/01/21/…
Soren

แผนคือการรวมทุกอย่าง (รวมถึงการเข้าสู่ระบบ) ไว้ในแอป AngularJS ในที่สุด แต่ในขณะที่เรากำลังเปลี่ยนไปใช้ AngularJS หน้าจอการลงทะเบียน / เข้าสู่ระบบดูเหมือนจะมีความสำคัญน้อยที่สุดในขั้นตอนนี้
Thorbjørn Kappel Hansen

คำตอบ:


82

ฉันเชื่อว่าวิธีที่จะทำคือ $location.url('/RouteTo/Login');

แก้ไขเพื่อความชัดเจน

สมมติว่าเส้นทางของฉันสำหรับมุมมองการเข้าสู่ระบบของฉันคือ/Loginฉันจะบอกว่า$location.url('/Login')ให้นำทางไปยังเส้นทางนั้น

สำหรับตำแหน่งที่อยู่นอกแอป Angular (เช่นไม่มีการกำหนดเส้นทาง) JavaScript แบบเก่าธรรมดาจะให้บริการ:

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

พยายามแค่นั้น น่าเสียดายที่เปลี่ยนเส้นทางไปที่ www.domain.com/app/RouteTo/login แทนที่จะเป็น www.domain.com/login
Thorbjørn Kappel Hansen

ถูกต้องนั่นไม่ได้หมายความว่าจะเป็นตัวอักษร ฉันไม่รู้ว่าคุณกำหนดเส้นทางสำหรับมุมมองการเข้าสู่ระบบของคุณอย่างไร วางเส้นทางใดก็ได้ในอาร์กิวเมนต์สำหรับเมธอด $ location.url () ฉันได้แก้ไขคำตอบเพื่อความชัดเจน
m.casey

อ่าถูกต้อง ปัญหาคือ $ location.url ยังคงเปลี่ยนเส้นทางไปยังเส้นทางย่อยของแอป ดังนั้นการใช้ $ location.url ('/ login') จึงเปลี่ยนเส้นทางไปที่ www.domain.com/app/login แทนที่จะเป็น www.domain.com/login
Thorbjørn Kappel Hansen

1
ตามที่ระบุไว้ในคำถามขณะนี้หน้าเข้าสู่ระบบอยู่นอกแอป AngularJS ดังนั้นจึงจำเป็นต้องเปลี่ยนเส้นทางไปที่ www.domain.com/login แทนที่จะเป็นเส้นทางภายในแอป
Thorbjørn Kappel Hansen

5
นอกจากนี้ยังควรค่าแก่การกล่าวถึงว่าคุณควรใช้$windowแทนwindow(ที่มา: stackoverflow.com/questions/28906180/… )
Caleb Faruki

39

ดูเหมือนว่าการโหลดซ้ำแบบเต็มหน้า$window.location.hrefเป็นวิธีที่ต้องการ

ไม่ทำให้เกิดการโหลดซ้ำแบบเต็มหน้าเมื่อเปลี่ยน URL ของเบราว์เซอร์ หากต้องการโหลดหน้าซ้ำหลังจากเปลี่ยน URL ให้ใช้ API ระดับล่าง $ window.location.href

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


19

มันอาจช่วยคุณได้! การสาธิต

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

ตัวอย่างโค้ด HTML

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

3

ไม่แน่ใจว่ามาจากเวอร์ชันอะไร แต่ฉันใช้ 1.3.14 และคุณสามารถใช้:

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

ไม่จำเป็นต้องฉีด$locationหรือ$windowในตัวควบคุมและไม่จำเป็นต้องรับที่อยู่โฮสต์ปัจจุบัน


-11

คุณต้องใส่:

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

วิธีนี้ฟังก์ชันเชิงมุมสามารถเข้าถึงวัตถุ "หน้าต่าง" ได้


อย่ากลัว!
มิกะ
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.