AngularJS - ฉันจะเปลี่ยนเส้นทางด้วยการโหลดเต็มหน้าได้อย่างไร


94

ฉันต้องการเปลี่ยนเส้นทางที่จะโหลดแบบเต็มหน้าซ้ำเพื่อให้คุกกี้จากเว็บเซิร์ฟเวอร์ของฉันได้รับการรีเฟรชเมื่อโหลดหน้าเว็บ window.location = "/#/Next"และwindow.location.href = "/#/Next"ไม่ทำงานพวกเขาทำเส้นทางเชิงมุมซึ่งไม่เข้าสู่เซิร์ฟเวอร์

อะไรคือวิธีที่ถูกต้องในการส่งคำขอเซิร์ฟเวอร์แบบเต็มภายใน Angular Controller?


8
คุณเคยแก้ปัญหานี้หรือไม่
superjos

7
คุณเคยแก้ปัญหานี้หรือไม่
Nolwennig

6
คุณเคยแก้ปัญหานี้หรือไม่
Dan Beaulieu

5
คุณเคยแก้ปัญหานี้หรือไม่
My Stack Overfloweth

4
คุณเคยแก้ปัญหานี้หรือไม่
shahzain ali

คำตอบ:


185

สำหรับ<a>แท็ก :

คุณต้องติดแท็กtarget="_self"ของคุณ<a>

มีสามกรณีที่ AngularJS จะทำการรีโหลดเต็มหน้า:

  • ลิงค์ที่มีองค์ประกอบเป้าหมาย
    ตัวอย่าง:<a href="https://stackoverflow.com/ext/link?a=b" target="_self">link</a>
  • ลิงก์สัมบูรณ์ที่ไปยังโดเมนอื่น
    ตัวอย่าง:<a href="http://angularjs.org/">link</a>
  • ลิงก์ที่ขึ้นต้นด้วย '/' ที่นำไปสู่เส้นทางฐานอื่นเมื่อกำหนดฐาน
    ตัวอย่าง:<a href="https://stackoverflow.com/not-my-base/link">link</a>

ใช้จาวาสคริปต์ :

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

ดู:


15
$ window.location.href ทำสิ่งเดียวกับที่ window.location.href ทำ ฉันค่อนข้างมั่นใจว่า $ window เป็นเพียงบริการตัดหน้าต่างเท่านั้น ทั้งสองวิธีทำเส้นทางเชิงมุมแทนการรีเฟรชแบบเต็มหน้า
Mike Pateras

3
$ window.location.href ทำให้เกิดการรีเฟรชแบบเต็มหน้าอย่างแน่นอนฉันทำในแอปของฉัน
jszobody

3
เคยอ่านมาเหมือนกัน ไม่ทำงานใน Chrome เวอร์ชันปัจจุบัน มันเป็นเส้นทางเชิงมุม
Mike Pateras

1
1.0.6 จาก CDN ฉันทำสิ่งนี้ภายใน $ http.post การติดต่อกลับหากเป็นเรื่องสำคัญแม้ว่าฉันจะลองใช้นอกการโทรกลับและได้ผลลัพธ์เดียวกัน หากฉันทำการเปลี่ยนเส้นทางไปที่ "/" (ซึ่งฉันมีเส้นทางเชิงมุมที่กำหนดไว้ด้วยเช่นกัน) จะใช้ได้กับการรีเฟรชแบบเต็มหน้า แต่ "/ # / ถัดไป" จะเปลี่ยนมุมมอง
Mike Pateras

5
<a href="..." target="_self">คือสิ่งที่ใช้ได้ผลสำหรับฉัน ขอบคุณ!
Michael

33

เรามีปัญหาเดียวกันโดยทำงานจากโค้ด JS (เช่นไม่ใช่จากจุดยึด HTML) นี่คือวิธีที่เราแก้ไข:

  1. ถ้ามีความจำเป็นจริงเปลี่ยน URL ปัจจุบันผ่าน$locationบริการ สิ่งนี้อาจมีประโยชน์หากปลายทางของคุณเป็นเพียงรูปแบบหนึ่งของ URL ปัจจุบันเพื่อให้คุณสามารถใช้ประโยชน์จาก$locationวิธีการช่วยเหลือได้ เช่นเราวิ่ง$location.search(..., ...)เพื่อเปลี่ยนค่าของพารามิเตอร์สตริงคำค้นหา

  2. สร้าง URL ปลายทางใหม่โดยใช้ปัจจุบัน$location.url()หากจำเป็น เพื่อให้ทำงานได้สิ่งใหม่นี้ต้องรวมทุกอย่างไว้หลังสคีมาโดเมนและพอร์ต ดังนั้นหากคุณต้องการย้ายไปที่:

    http://yourdomain.com/YourAppFolder/YourAngularApp/#/YourArea/YourAction?culture=th

    คุณควรตั้งค่า URL เป็น:

    var destinationUrl = '/YourAppFolder/YourAngularApp/#/YourArea/YourAction?culture=en';

    (มีชั้นนำ'/'ด้วย).

  3. กำหนด URL ปลายทางใหม่ที่ระดับต่ำ :$window.location.href = destinationUrl;

  4. บังคับให้โหลดซ้ำยังคงอยู่ในระดับต่ำ: $window.location.reload();


1
สิ่งนี้ใช้ไม่ได้สำหรับฉันใน Angular 1.3.1 กับ Chrome 38 ค่าของ $ window.location.href ไม่เปลี่ยนแปลงเมื่อฉันกำหนดเส้นทางหรือ URL แบบเต็ม มีเพียง $ window.location.assign () เท่านั้นที่ใช้ได้สำหรับฉัน
FelixM

มีปัญหาเดียวกับเฟลิกซ์แก้ไขด้วยวิธีอื่นstackoverflow.com/questions/31137809/…
Soroush Hakami

13

หลังจากค้นหาและให้ Hit และเซสชันทดลองใช้แล้วฉันสามารถแก้ปัญหาได้โดยระบุ url ก่อนเช่น

$window.location.href = '/#/home/stats';

จากนั้นโหลดใหม่

$window.location.reload();

ดูเหมือนว่าจะแก้ปัญหาได้ แต่การคลิกย้อนกลับและไปข้างหน้าบนเบราว์เซอร์จะทำให้เกิดความไม่สอดคล้องกันมากมาย
luisluix

9

ฉันมีปัญหาเดียวกัน เมื่อฉันใช้window.location, $window.locationหรือแม้กระทั่ง<a href="..." target="_self">เส้นทางไม่รีเฟรชหน้าเว็บ ดังนั้นจึงใช้บริการแคชซึ่งไม่ใช่สิ่งที่ฉันต้องการในแอปของฉัน ฉันแก้ไขโดยการเพิ่มwindow.location.reload()after window.locationเพื่อบังคับให้โหลดหน้าซ้ำหลังจากกำหนดเส้นทาง วิธีนี้ดูเหมือนจะโหลดหน้าเว็บสองครั้ง อาจเป็นเคล็ดลับสกปรก แต่ได้ผล นี่คือวิธีที่ฉันมีตอนนี้:

  $scope.openPage = function (pageName) {
      window.location = '#/html/pages/' + pageName;
      window.location.reload();
  };

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