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.

Alexandru R
sumber
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?)

George
sumber
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.

zmilan
sumber
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:'/'});
    }
);
chrisjordanme
sumber
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.

Roy Daniels
sumber