AngularJs UI-Router - การรีเฟรชหน้า $state.current ตอนนี้ว่างเปล่า

ฉันมีแอปพลิเคชัน Angular ที่ใช้ ui-router และฉันประสบปัญหาทุกครั้งที่รีเฟรชหน้าเว็บ ฉันกำลังใช้มุมมองแบบซ้อนและตั้งชื่อมุมมองเพื่อสร้างแอปพลิเคชัน เมื่อใดก็ตามที่ฉันรีเฟรชหน้า ui-router จะไม่โหลดสถานะปัจจุบันซ้ำและปล่อยให้หน้าว่างไว้

ในการโหลดหน้า $state.current เท่ากับ

Object {name: "", url: "^", views: null, abstract: true}

ฉันกำลังอ่านการนำทางของฉันจากไฟล์ .json ผ่าน $http และวนซ้ำไปตามสถานะต่างๆ นี่คือสิ่งที่ฉันสามารถแสดงได้:

stateProvider.state(navElement.stateName, {
    url: navElement.regexUrl ? navElement.regexUrl : url,
    searchPage: navElement.searchPage,   //something custom i added
    parent: navElement.parent ? navElement.parent : "",
    redirectTo: navElement.redirectTo,
    views: {
        'subNav@index': {
            templateUrl: defaults.secondaryNavigation,
            controller: 'secondaryNavigationController as ctrl' //static
        },
        'pageContent@index': {
            template: navElement.templateUrl == null 
                                              ? '<div class="emptyContent"></div>' 
                                              : undefined,
            templateUrl: navElement.templateUrl == null 
                                              ? undefined 
                                              : navElement.templateUrl,
            controller: navElement.controller == null 
                                              ? undefined 
                                              : navElement.controller + ' as ctrl'
        }
    }
});

รหัสนี้ถูกดำเนินการสำหรับแต่ละรายการในวัตถุ json ที่ซ้อนกัน หากมีสิ่งใดที่จะเป็นประโยชน์อีกโปรดแจ้งให้เราทราบ


person gwin003    schedule 29.04.2015    source แหล่งที่มา


คำตอบ (2)


มีคำถาม: AngularJS - UI-router - วิธีกำหนดค่ามุมมองแบบไดนามิก ด้วยคำตอบเดียว ซึ่งแสดงวิธีการทำเช่นนั้น .

เกิดอะไรขึ้น? เมื่อรีเฟรช url จะได้รับการประเมินเร็วขึ้น จากนั้นสถานะจะถูกลงทะเบียน เราต้องเลื่อนออกไป และโซลูชันขับเคลื่อนโดย UI-Router คุณลักษณะดั้งเดิม deferIntercept(defer)

$urlRouterProvider.deferIntercept(defer)

ตามที่ระบุไว้ในเอกสาร:

ปิดใช้งาน (หรือเปิดใช้งาน) การเลื่อนการสกัดกั้นการเปลี่ยนแปลงตำแหน่ง

หากคุณต้องการปรับแต่งลักษณะการทำงานของการซิงค์ URL (เช่น หากคุณต้องการเลื่อนการเปลี่ยนแปลงแต่คง URL ปัจจุบันไว้) ให้เรียกใช้เมธอดนี้ในเวลากำหนดค่า จากนั้น ณ รันไทม์ ให้โทร $urlRouter.listen() หลังจากที่คุณได้กำหนดค่าตัวจัดการเหตุการณ์ $locationChangeSuccess ของคุณเองแล้ว

โดยสรุป เราจะหยุดการจัดการ URL ในขั้นตอนการกำหนดค่า:

app.config(function ($urlRouterProvider) {
 
  // Prevent $urlRouter from automatically intercepting URL changes;
  // this allows you to configure custom behavior in between
  // location changes and route synchronization:
  $urlRouterProvider.deferIntercept();
 
})

และเราจะเปิดใช้งานอีกครั้งในระยะ .run() เมื่อเรากำหนดค่าสถานะไดนามิกทั้งหมดจาก JSON:

.run(function ($rootScope, $urlRouter, UserService) {
 
  ...

    // Once the user has logged in, sync the current URL
    // to the router:
     $urlRouter.sync();
 
    // Configures $urlRouter's listener *after* your custom listener
    $urlRouter.listen();
});

มี plunker จาก ถามตอบ

person Radim Köhler    schedule 29.04.2015
comment
เพียงหมายเหตุ ฉันคาดว่าข้อความดังกล่าวจะเป็นคำถาม ..ฉันกำลังอ่านการนำทางของฉันจากไฟล์ json... หมายความว่าคุณกำลังดำเนินการจากการโหลด .json โหลดผ่าน $http ถ้าไม่เช่นนั้นคำตอบของฉันก็คงไม่ช่วย... - person Radim Köhler; 29.04.2015
comment
ฉันกำลังโหลดไฟล์ json ผ่านการเรียก $http ไปยังบริการ WebApi ดังนั้นคำตอบของคุณยังคงมีผลอยู่ แม้ว่าฉันจะเพิ่ม deferIntercept() ในการกำหนดค่าของฉันและ sync() และ listen() ในวิธีการเรียกใช้ของฉัน ฉันยังคงพบปัญหาเดียวกัน - person gwin003; 29.04.2015
comment
ฉันก็ใช้เหมือนกันในชีวิตจริง 1:1. ฉันอยากจะแนะนำให้ตรวจสอบนักวางระเบิดของฉันและนั่นน่าจะช่วยได้ (รวมถึงรายละเอียดในส่วนถาม & คำตอบที่เชื่อมโยง) หรือปรับพลั้งเกอร์ของฉัน และแสดงให้ฉันเห็นว่าอะไรไม่ทำงาน... เพราะด้วยตัวอย่างข้อมูลในคำถามของคุณ มันเกือบจะเป็นจำนวนสูงสุดที่ฉันสามารถแสดงได้ ฉันขอแนะนำได้... มันสมเหตุสมผลไหม? - person Radim Köhler; 29.04.2015
comment
ข้อแตกต่างเพียงอย่างเดียวคือ URL ของคุณมี ^ แต่ของฉันไม่มี นั่นอาจเป็นผู้กระทำผิดหรือไม่? - person gwin003; 29.04.2015
comment
นี่เป็นเพียงการรีเซ็ต URL หากไม่มีมัน - เด็ก ๆ จะสืบทอดส่วนแรกจากผู้ปกครอง ด้วยสัญลักษณ์นี้ URL ของเด็กจะเริ่มต้นจากจุดเริ่มต้น เลยสงสัยว่านี่คือประเด็น... - person Radim Köhler; 29.04.2015
comment
กำลังแก้ไขจุดบกพร่องของแหล่งที่มาของ ui-router ตอนนี้ ฉันจะรายงานกลับ ดูเหมือนว่าฟังก์ชัน check() ภายในฟังก์ชัน update() จะไม่จัดการ URL ทุกครั้งที่มีการตรวจสอบกฎ อาจเป็นไปได้ว่า URL ของฉันไม่ได้รับการตั้งค่าอย่างถูกต้องในรัฐของฉัน URL ของฉันได้รับการตั้งค่าดังนี้: pastebin.com/ZHepheCX - person gwin003; 29.04.2015
comment
ตอนนี้ฉันสามารถแก้ไขปัญหาได้ค่อนข้างมากแล้ว มันเป็นปัญหา 2 ส่วน โดยการเพิ่ม deferIntercept(), sync() และ listen() ช่วยแก้ปัญหาได้ส่วนหนึ่ง ฉันยังพบปัญหาหาก URL ของฉันมีเครื่องหมายทับ ดังนั้นการเพิ่ม $urlMatcherFactoryProvider.strictMode(false) จึงช่วยแก้ไขปัญหานั้นได้ ขอบคุณที่ช่วยฉันอีกครั้ง @RadimKohler! - person gwin003; 30.04.2015
comment
@ RadimKöhler สิ่งนี้ช่วยแก้ปัญหาของฉันเมื่อรีเฟรชสถานะย่อย แต่ถ้าฉันพยายามเข้าถึงดัชนีฐาน '/' เท่านั้น ฉันได้รับการรีเฟรชแบบไม่สิ้นสุดโดยอัตโนมัติ - person LogronJ; 05.09.2018
comment
ฉันมี $urlRouterProvider.otherwise('/'); มันควรไปสู่สถานะเฉพาะ - person LogronJ; 05.09.2018

ฉันไม่รู้ว่าเส้นทางทั้งหมดของคุณเป็นยังไงบ้าง.. แต่ถ้าคุณรีเฟรชหน้าสถานะลูก คุณจะต้องผ่านพารามิเตอร์ทั้งหมดของสถานะพาเรนต์จึงจะได้รับการแก้ไขอย่างถูกต้อง

person manzapanza    schedule 29.04.2015