เปลี่ยนเส้นทางโดยใช้ AngularJS


86

ฉันพยายามเปลี่ยนเส้นทางไปยังเส้นทางอื่นโดยใช้:

$location.path("/route");

แต่ด้วยเหตุผลบางอย่างมันไม่ทำงาน ฉันทำวิดเจ็ตเติมข้อความอัตโนมัติโดยใช้ jQuery-UI และฉันกำลังเรียกใช้ฟังก์ชันจากขอบเขตเมื่อผู้ใช้เลือกตัวเลือก ฉันแก้ไขข้อบกพร่องและเข้าสู่ฟังก์ชัน แต่จะไม่ถูกเปลี่ยนเส้นทางไปยังเส้นทางอื่น มันจะเปลี่ยนเส้นทางเมื่อฉันกดปุ่มเท่านั้น

ฉันคิดว่ามันแปลก ๆ แต่ฉันยังไม่ได้หาวิธีแก้ปัญหานี้ ฉันใช้

window.location = "#/route";

และใช้งานได้ แต่ฉันต้องการใช้path()ฟังก์ชันนี้

ใครมีความคิดว่าทำไมถึงเกิดขึ้น?

คำตอบ:


109

ด้วยตัวอย่างของรหัสที่ใช้งานไม่ได้มันจะง่ายต่อการตอบคำถามนี้ แต่ด้วยข้อมูลนี้สิ่งที่ดีที่สุดที่ฉันคิดได้คือคุณกำลังเรียก $ location.path นอก AngularJS Digest

ลองทำสิ่งนี้กับคำสั่ง scope.$apply(function() { $location.path("/route"); });


ขอบคุณมากและขออภัยที่ไม่ได้โพสต์ตัวอย่างที่ใช้งานไม่ได้ แต่นี่คือสิ่งที่รหัสของฉันต้องการ
Tomarto

23
มีความคิดอย่างไรที่จะทำให้สิ่งนี้ทำงานในเมธอด .success ภายในคำขอ $ http @Tomarto
Nicholas Kreidberg

2
บนคอนโซล firefox (30 ~) เกิดข้อผิดพลาดว่า $ ใช้รอบไม่ว่าง
svarog

1
มันควรจะทำงานอย่างไร? ฉันได้รับข้อผิดพลาดต่อไปนี้: ข้อผิดพลาด: [$ rootScope: inprog] $ ใช้แล้วในความคืบหน้าerror.angularjs.org/1.2.15/$rootScope/inprog?p0=%24 ใช้ ที่ angular.js: 78 ..... ดังนั้นจึงไม่ทำงานเป็น windows.location = '' ..
Vaibhav

1
@NicholasKreidberg มีคำถามเดียวกันและเพิ่งเพิ่ม $ ขอบเขต $ ใช้ (); หลังจาก $ location.path ("/ route"); ทำงานให้ฉัน
Ernesto Allely

81

อย่าลืมฉีด$locationเข้าคอนโทรลเลอร์


2
จับได้ดีนั่นคือปัญหาสำหรับฉัน
Jason Swett

ดีมากขอบคุณสำหรับการโพสต์สิ่งที่ดูเหมือนจะไม่ชัดเจน
Chuck Conway

20

สมมติว่าคุณไม่ได้ใช้ HTML5 $location.path("route")เส้นทางลอง การดำเนินการนี้จะเปลี่ยนเส้นทางเบราว์เซอร์ของคุณไปยัง#/routeสิ่งที่คุณต้องการ


15

$window.locationหากคุณจำเป็นต้องเปลี่ยนเส้นทางจากการใช้แอปพลิเคเชิงมุมของคุณ นั่นคือกรณีของฉัน หวังว่าจะมีคนพบว่ามีประโยชน์


2

ตรวจสอบวิธีการกำหนดเส้นทางของคุณ:

หากสถานะการกำหนดเส้นทางของคุณเป็นเช่นนี้

 .state('app.register', {
    url: '/register',
    views: {
      'menuContent': {
        templateUrl: 'templates/register.html',
      }
    }
  }) 

คุณควรใช้

$location.path("/app/register");

0

เป็นการยากที่จะพูดโดยไม่รู้รหัสของคุณ ฉันเดาได้ดีที่สุดคือonchangeเหตุการณ์ไม่เริ่มทำงานเมื่อคุณเปลี่ยนค่ากล่องข้อความจากโค้ด JavaScript

มีสองวิธีในการทำงาน อย่างแรกคือโทรonchangeด้วยตัวเองและอย่างที่สองคือรอให้กล่องข้อความหลุดโฟกัส

ตรวจสอบคำถามนี้ ; ปัญหาเดียวกันกรอบที่แตกต่างกัน

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