AngularJs UI-Router - Penyegaran Halaman $state.current sekarang kosong

Saya memiliki aplikasi Angular yang menggunakan ui-router dan saya mengalami masalah setiap kali menyegarkan halaman. Saya menggunakan tampilan bersarang, tampilan bernama untuk membangun aplikasi. Setiap kali saya menyegarkan halaman, ui-router tidak memuat ulang status saat ini dan membiarkan halaman kosong.

Pada pemuatan halaman $state.current sama dengan

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

Saya membaca navigasi saya dari file .json melalui $http dan menelusuri negara bagian. Jadi ini yang bisa saya tunjukkan:

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

Kode ini dieksekusi untuk setiap item di objek json bersarang. Jika ada hal lain yang berguna, beri tahu saya.


person gwin003    schedule 29.04.2015    source sumber


Jawaban (2)


Ada pertanyaan: AngularJS - UI-router - Cara mengonfigurasi tampilan dinamis dengan satu jawaban, yang menunjukkan cara melakukannya .

Apa yang terjadi? Saat penyegaran, url dievaluasi lebih cepat, kemudian negara bagian didaftarkan. Kita harus menundanya. Dan solusi didorong oleh UI-Router fitur asli deferIntercept(defer)

$urlRouterProvider.deferIntercept(defer)

Sebagaimana dinyatakan dalam dokumen:

Menonaktifkan (atau mengaktifkan) menunda intersepsi perubahan lokasi.

Jika Anda ingin menyesuaikan perilaku sinkronisasi URL (misalnya, jika Anda ingin menunda transisi namun mempertahankan URL saat ini), panggil metode ini pada waktu konfigurasi. Kemudian, pada saat run time, panggil $urlRouter.listen() setelah Anda mengkonfigurasi event handler $locationChangeSuccess Anda sendiri.

Singkatnya, kami akan menghentikan penanganan URL dalam fase konfigurasi:

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

Dan kami akan mengaktifkannya kembali dalam fase .run(), setelah kami mengonfigurasi semua status dinamis dari 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();
});

Ada plunker dari Tanya Jawab

person Radim Köhler    schedule 29.04.2015
comment
Hanya CATATAN. Saya mengharapkan pernyataan yang dimaksud ..Saya membaca navigasi saya dari file json... berarti Anda melakukannya dari dimuat .json, dimuat melalui $http. Jika tidak, jawaban saya tidak akan membantu... - person Radim Köhler; 29.04.2015
comment
Saya memuat file json melalui panggilan $http ke layanan WebApi, jadi jawaban Anda masih berlaku. Meskipun saya menambahkan deferIntercept() ke konfigurasi saya dan sync() dan listen() ke metode run saya, saya masih mengalami masalah yang sama. - person gwin003; 29.04.2015
comment
Saya menggunakan hal yang sama dalam kehidupan nyata. 1:1. Saya menyarankan, selidiki plunker saya dan itu akan membantu (ditambah detail dalam Tanya Jawab tertaut). Atau sesuaikan plunker saya, dan tunjukkan apa yang tidak berfungsi... Karena dengan cuplikan di pertanyaan Anda, sudah hampir maksimal yang dapat saya tampilkan, saya dapat menyarankan... Apakah masuk akal? - person Radim Köhler; 29.04.2015
comment
Satu-satunya perbedaan adalah url Anda berisi ^ dan url saya tidak. Mungkinkah itu pelakunya? - person gwin003; 29.04.2015
comment
Ini hanyalah penyetel ulang url. Tanpa itu - anak-anak mewarisi bagian pertama dari orang tua. Dengan tanda ini, url anak dimulai dari awal. Jadi, saya ragu ini adalah masalah... - person Radim Köhler; 29.04.2015
comment
Debugging sumber ui-router sekarang, saya akan laporkan kembali. Sepertinya fungsi check() di dalam fungsi update() tidak menangani url setiap kali aturan diperiksa. Mungkin url saya tidak diatur dengan benar di negara bagian saya. Url saya diatur seperti ini: pastebin.com/ZHepheCX - person gwin003; 29.04.2015
comment
Saya bisa menyelesaikan solusi saya dengan cukup banyak sekarang. Itu adalah masalah 2 bagian, menambahkan deferIntercept(), sync() dan listen() menyelesaikan satu bagian dari masalah. Saya juga melihat masalah jika URL saya memiliki garis miring, jadi menambahkan $urlMatcherFactoryProvider.strictMode(false) menyelesaikan masalah itu. Terima kasih telah menyelamatkan saya lagi @RadimKohler! - person gwin003; 30.04.2015
comment
@RadimKöhler ini menyelesaikan masalah saya saat menyegarkan status anak. tetapi jika saya mencoba mengakses indeks dasar '/' saja. Saya mendapatkan penyegaran tanpa batas secara otomatis. - person LogronJ; 05.09.2018
comment
saya punya $urlRouterProvider.otherwise('/'); itu harus menuju ke keadaan tertentu. - person LogronJ; 05.09.2018

Saya tidak tahu bagaimana semua rute Anda.. tetapi jika Anda menyegarkan halaman status anak, Anda harus meneruskan semua parameter status induk agar dapat diselesaikan dengan benar.

person manzapanza    schedule 29.04.2015