เส้นทางของ angularjs สามารถมีค่าพารามิเตอร์ทางเลือกได้หรือไม่?


166

ฉันสามารถตั้งค่าเส้นทางด้วย params เผื่อเลือก (เทมเพลตและคอนโทรลเลอร์เดียวกันได้ แต่ควรละเว้นบาง params หากไม่มีอยู่หรือไม่?

ดังนั้นแทนที่จะเขียนกฎสองข้อต่อไปนี้มีเพียงกฎเดียวหรือไม่

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

บางสิ่งเช่นนี้ ([พารามิเตอร์นี้เป็นตัวเลือก])

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

ฉันไม่พบสิ่งใดในเอกสารของพวกเขา


พวกเขาจะถูกละเว้น (โดยไม่มี[]) ในเวอร์ชัน 1.1.5
OZ_

จริงๆ? ฉันใช้ 1.1.5 แล้วลองใช้รหัส [: userId] และอย่าเพิกเฉย
Alexandru R

[]โดยไม่ต้องพยายาม ดูการกระทำนี้: github.com/angular/angular.js/commit/…
OZ_

อ๊ะขอโทษด้วยมันเกี่ยวกับ $ resource ไม่แน่ใจว่ามันจะทำงานในการเราต์หรือไม่ ขออนุญาต.
OZ_

1
ถ้าคำตอบของ g-orge ดีคุณช่วยทำเครื่องหมายให้คนอื่นไม่ต้องเลื่อนดูทั้งหมดเพื่อหาคำตอบที่ดีที่สุด?
AlexStack

คำตอบ:


243

ดูเหมือนว่า Angular จะสนับสนุนสิ่งนี้ในตอนนี้

จากเอกสารล่าสุด (v1.2.0) สำหรับ$routeProvider.when(path, route):

pathสามารถมีกลุ่มชื่อที่เป็นตัวเลือกพร้อมเครื่องหมายคำถาม ( :name?)


7
วิธีใดที่จะหลีกเลี่ยงการใช้เครื่องหมายสแลชต่อท้าย? หากเส้นทางของฉันคือ: .when('/claims/documents/:CLAIMS_ID/:DOCUMENT_NAME?'...มันจะไม่ตรงกันถ้า URL ไม่มีเครื่องหมายทับ /claims/documents/1234/ตรงกันดังนั้นแต่/claims/documents/1234ไม่
James Bell

1
ต้องการทราบว่าใครมีวิธีแก้ไขปัญหาที่รายงานโดย @JamesBell
Leiko

5
ในฐานะของ Angular 1.3 ปัญหาสแลชต่อท้ายที่กล่าวถึงในความคิดเห็นด้านบนได้รับการแก้ไขแล้ว การนำทางไปยัง / อ้างสิทธิ์ / เอกสาร / 1234 / ทำงานอย่างถูกต้องเช่นเดียวกับ / อ้างสิทธิ์ / เอกสาร / 1234 ในระยะสั้นมันทำงานได้โดยมีหรือไม่มีเครื่องหมายทับ
Judah Gabriel Himango

1
ฉันยังคงเห็นพฤติกรรมนี้หากฉันมีพารามิเตอร์ทางเลือกในเส้นทางของฉัน ตัวอย่างเช่น: หากเส้นทางคือ: '/: การจัดประเภท? / แพ็คเกจ / เปรียบเทียบ' และฉันพยายามนำทางไปยัง url "/ package / compar" มันใช้งานได้ ถ้าฉันลอง '/ package / เปรียบเทียบ /' ด้วยเหตุผลบางอย่างฉันได้รับรหัส asci ต่อท้ายการจำแนกหรือ '/% 3f / แพ็คเกจ / เปรียบเทียบ' ซึ่งไม่ใช่เส้นทางจริง
ruby_newbie

เอกสารกำลังสับสน
Oliver Dixon

59

เช่นเดียวกับ @ g-eorge พูดถึงคุณสามารถทำให้มันเป็นเช่นนี้:

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

คุณสามารถสร้างได้มากเท่าที่คุณต้องการพารามิเตอร์ทางเลือก


8

โปรดดูคำตอบ @jlareau ที่นี่: /programming/11534710/angularjs-how-to-use-routeparams-in-generating-the-templateurl

คุณสามารถใช้ฟังก์ชั่นในการสร้างสตริงแม่แบบ:

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

ที่จริงฉันคิดว่า OZ_ อาจจะค่อนข้างถูกต้อง

หากคุณมีเส้นทาง'/users/:userId'และนำทางไปยัง'/users/'(สังเกตตาม /) $routeParamsในตัวควบคุมของคุณควรเป็นวัตถุที่มีuserId: ""ใน 1.1.5 ดังนั้นไม่มีผู้กำกับuserIdไม่ได้เพิกเฉย แต่ฉันคิดว่ามันเป็นสิ่งที่ดีที่สุดที่คุณจะได้รับ

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