Bisakah rute angular memiliki nilai parameter opsional?


166

Dapatkah saya menetapkan rute dengan params opsional (templat dan pengontrol yang sama, tetapi beberapa params harus diabaikan jika tidak ada?

Jadi, alih-alih menulis dua aturan berikut, hanya punya satu?

module.config(['$routeProvider', function($routeProvider) {
    $routeProvider.
     when('/users/', {templateUrl: 'template.tpl.html', controller: myCtrl}).            
     when('/users/:userId', {templateUrl: 'template.tpl.html', controller: myCtrl})
}]);

Sesuatu seperti ini ([param ini opsional])

when('/users[/:userId]', {templateUrl: 'template.tpl.html', controller: myCtrl})
//note: this previous doesn't work

Saya tidak dapat menemukan apa pun di dokumentasi mereka.


mereka akan diabaikan (tanpa []) dalam versi 1.1.5.
OZ_

Betulkah? Saya menggunakan 1.1.5, mencoba dengan kode [: userId] dan tidak mengabaikannya.
Alexandru R

coba tanpa []. Lihat komit ini: github.com/angular/angular.js/commit/…
OZ_

oops, maaf, ini tentang $ resource, tidak yakin apakah itu akan berfungsi dalam routing. permisi.
OZ_

1
Jika jawaban g-orge baik, tolong tandai agar orang tidak perlu menggulir semuanya untuk menemukan jawaban terbaik?
AlexStack

Jawaban:


243

Sepertinya Angular memiliki dukungan untuk ini sekarang.

Dari dokumen terbaru (v1.2.0) untuk $routeProvider.when(path, route):

pathdapat berisi grup bernama opsional dengan tanda tanya ( :name?)


7
Adakah cara untuk menghindari penggunaan garis miring? Jika rute saya adalah: .when('/claims/documents/:CLAIMS_ID/:DOCUMENT_NAME?'...itu tidak akan cocok jika url tidak memiliki garis miring. Jadi /claims/documents/1234/cocok, tetapi /claims/documents/1234tidak.
James Bell

1
Ingin tahu apakah ada yang punya solusi untuk masalah yang dilaporkan oleh @JamesBell
Leiko

5
Pada Angular 1.3, masalah garis miring yang disebutkan dalam komentar di atas sudah diperbaiki. Menavigasi ke / klaim / dokumen / 1234 / berfungsi dengan benar, seperti halnya / klaim / dokumen / 1234. Singkatnya, ini berfungsi dengan atau tanpa garis miring.
Yehuda Gabriel Himango

1
Saya masih melihat perilaku ini jika saya memiliki parameter opsional di rute saya. Sebagai contoh: jika rutenya adalah: '/: klasifikasi? / Paket / bandingkan' dan saya mencoba menavigasi ke url "/ paket / bandingkan" berfungsi. Jika saya mencoba '/ paket / bandingkan /' karena beberapa alasan saya mendapatkan kode asci ditambahkan ke klasifikasi, atau '/% 3f / paket / bandingkan' yang bukan rute yang sebenarnya.
ruby_newbie

Dokumentasi membingungkan.
Oliver Dixon

59

Seperti @ g-eorge mention, Anda dapat membuatnya seperti ini:

module.config(['$routeProvider', function($routeProvider) {
$routeProvider.
  when('/users/:userId?', {templateUrl: 'template.tpl.html', controller: myCtrl})
}]);

Anda juga dapat membuat sebanyak yang Anda butuhkan parameter opsional.


8

Silakan lihat @jlareau jawab di sini: /programming/11534710/angularjs-how-to-use-routeparams-in-generating-the-templateurl

Anda dapat menggunakan fungsi untuk menghasilkan string template:

var app = angular.module('app',[]);

app.config(
    function($routeProvider) {
        $routeProvider.
            when('/', {templateUrl:'/home'}).
            when('/users/:user_id', 
                {   
                    controller:UserView, 
                    templateUrl: function(params){ return '/users/view/' + params.user_id;   }
                }
            ).
            otherwise({redirectTo:'/'});
    }
);

2

Sebenarnya saya pikir OZ_ mungkin agak benar.

Jika Anda memiliki rute '/users/:userId'dan menavigasi ke '/users/'(perhatikan trailing /), $routeParamsdi controller Anda harus menjadi objek yang berisi userId: ""1.1.5. Jadi tidak ada paramater userIdyang tidak sepenuhnya diabaikan, tapi saya pikir itu yang terbaik yang akan Anda dapatkan.

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.