มิฉะนั้นใน StateProvider


95

การใช้ angular-ui-router ฉันจะใช้วิธีอื่นบน$ stateProvider ได้อย่างไรหรือฉันจะใช้มันได้อย่างไร


คุณพยายามจะทำอะไร? (โปรดทราบว่าฉันไม่เข้าใจ$stateProvider.otherwiseทั้งหมดดังนั้นจะช่วยฉันได้)
Kevin Meredith

คำตอบ:


124

$stateProviderคุณไม่สามารถใช้เพียง

คุณต้องฉีด$urlRouterProviderและสร้างรหัสที่คล้ายกับ:

$urlRouterProvider.otherwise('/otherwise');

/otherwiseURL จะต้องกำหนดไว้ในรัฐตามปกติ:

 $stateProvider
    .state("otherwise", { url : '/otherwise'...})

ดูลิงค์นี้ที่ksperling อธิบาย


คุณสามารถใช้งานได้จริง$stateProvider. ใช้งานน้อยลงหากคุณต้องการแสดงเทมเพลต แต่ไม่เปลี่ยนเส้นทาง ฉันชอบคำตอบของ @ juan-hernandez
weltschmerz

ค่าที่ส่งไปยังotherwise(ในกรณีนี้'/otherwise') ต้องตรงกับชื่อของรัฐ (พารามิเตอร์แรกถึง.state) หรือค่าสำหรับurlตัวเลือกหรือไม่
d512

ตอนนี้เลิกใช้แล้ว - ดูคำตอบจาก @babyburger
Vedran

81

คุณสามารถ$stateProviderใช้ไวยากรณ์ catch all ( "*path") คุณเพียงแค่ต้องเพิ่มการกำหนดค่าสถานะที่ด้านล่างของรายการของคุณดังต่อไปนี้:

$stateProvider.state("otherwise", {
    url: "*path",
    templateUrl: "views/error-not-found.html"
});

ตัวเลือกทั้งหมดมีอธิบายไว้ในhttps://github.com/angular-ui/ui-router/wiki/URL-Routing#regex-parameters https://github.com/angular-ui/ui-router/wiki/URL-Routing#regex-parameters

สิ่งที่ดีของตัวเลือกนี้ตรงข้าม$urlRouterProvider.otherwise(...)คือคุณไม่ถูกบังคับให้เปลี่ยนสถานที่


คุณช่วยอธิบายให้ละเอียดได้you're not forced to a location changeไหม: ?
Kevin Meredith

1
สิ่งที่เขาหมายถึงคือ url จะยังคงอยู่เหมือนเดิม ดังนั้นหากผู้ใช้ไป/this/does/not/existที่ URL ก็จะยังคงอยู่ในแถบที่อยู่ ทางออกอื่นจะนำคุณไปที่/otherwise
Matt Greer

ฉันใช้โซลูชันของคุณและได้ผล (ฉันสามารถเก็บ url ที่ไม่พบซึ่งดีมากเพราะฉันใช้luisfarzati.github.io/angularticsและด้วยวิธีนี้ฉันสามารถดูการนำทางไปยังหน้าที่ไม่พบ) สำหรับกรณีเมื่อ ไม่มี URL ที่ผู้ใช้นำทางไป อย่างไรก็ตามหากฉันไปที่ url นี้โดยใช้ $ state.go ('มิฉะนั้น') ภายในคอนโทรลเลอร์ฉันจะสูญเสีย url ฉันนำทางไปยังสถานะนี้อย่างชัดเจนเมื่อผู้ใช้ไปที่หน้ารายละเอียดของรายการและเซิร์ฟเวอร์ส่งคืน 404 (ตัวอย่างเช่นหากรายการถูกลบ) คุณรู้วิธีแก้ไขปัญหานี้หรือไม่?
pcatre

@pcatre คุณสามารถใช้ option location = false และ url จะไม่เปลี่ยนแปลง เช่น. $ state.go ('
else

35

คุณยังสามารถฉีด $ state ลงในฟังก์ชันอื่นได้ด้วยตนเองซึ่งคุณสามารถไปยังสถานะที่ไม่ใช่ url ได้ สิ่งนี้มีประโยชน์ที่เบราว์เซอร์จะไม่เปลี่ยนแถบที่อยู่ซึ่งมีประโยชน์ในการจัดการย้อนกลับไปยังหน้าที่แล้ว

    $urlRouterProvider.otherwise(function ($injector, $location) {
        var $state = $injector.get('$state');

        $state.go('defaultLayout.error', {
            title: "Page not found",
            message: 'Could not find a state associated with url "'+$location.$$url+'"'
        });
    });

ที่ช่วยแก้ปัญหาของฉันเกี่ยวกับวิธีตรวจสอบว่าเราเป็นช่วงกลางแอปหรือกำลังโหลดเมื่อมีการใช้งานเป็นอย่างอื่นขอบคุณมาก :)
Jörn Berkefeld

คุณช่วยวันของฉัน!
Maelig

อย่าลืมถ้าคุณต้องการลดสิ่งนี้คุณต้องฉีด $
Sten Muchow

4

ฉันแค่อยากจะพูดถึงคำตอบที่ดีที่มีให้แล้ว เวอร์ชันล่าสุดของ@uirouter/angularjsทำเครื่องหมายชั้นเรียนUrlRouterProviderว่าเลิกใช้งานแล้ว ตอนนี้พวกเขาแนะนำให้ใช้UrlServiceแทน คุณสามารถบรรลุผลลัพธ์เดียวกันได้ด้วยการปรับเปลี่ยนต่อไปนี้:

$urlService.rules.otherwise('/defaultState');

วิธีการเพิ่มเติม: https://ui-router.github.io/ng1/docs/1.0.16/interfaces/url.urlrulesapi.html


3

โอเคช่วงเวลาที่โง่เขลาเมื่อคุณรู้ว่าคำถามที่คุณถามนั้นได้รับคำตอบแล้วในบรรทัดแรกของโค้ดตัวอย่าง! เพียงแค่ดูโค้ดตัวอย่าง

       angular.module('sample', ['ui.compat'])
      .config(
        [        '$stateProvider', '$routeProvider', '$urlRouterProvider',
        function ($stateProvider,   $routeProvider,   $urlRouterProvider) {
          $urlRouterProvider
            .when('/c?id', '/contacts/:id')
            .otherwise('/'); // <-- This is what I was looking for ! 


          ....

ลองดูที่นี่


0

คำตอบที่ได้รับการยอมรับอ้างอิงถามเกี่ยวกับangular-route ui-routerคำตอบที่ยอมรับใช้"เสาหิน" $routeProviderซึ่งต้องใช้ngRouteโมดูล (ในขณะที่ui-routerต้องการui.routerโมดูล)

คำตอบอันดับสูงสุดใช้$stateProviderแทนและกล่าวว่าสิ่งที่ต้องการ.state("otherwise", { url : '/otherwise'... })แต่ฉันไม่สามารถหาเอ่ยถึงใด ๆ ของ "มิฉะนั้น" ในเอกสารมันเชื่อมโยง อย่างไรก็ตามฉันเห็นว่า$stateProviderมีการกล่าวถึงในคำตอบนี้โดยระบุว่า:

$stateProviderคุณไม่สามารถใช้เพียง คุณต้องฉีด$urlRouterProvider

นั่นคือสิ่งที่คำตอบของฉันอาจช่วยคุณได้ สำหรับฉันการใช้$urlRouterProviderแบบนี้ก็เพียงพอแล้ว:

 my_module
   .config([
    , '$urlRouterProvider'
    , function(
        , $urlRouterProvider){
            //When the url is empty; i.e. what I consider to be "the default"
            //Then send the user to whatever state is served at the URL '/starting' 
            //(It could say '/default' or any other path you want)
            $urlRouterProvider
                    .when('', '/starting');
                    //...
    }]);

คำแนะนำของฉันสอดคล้องกับui-router เอกสาร ( การแก้ไขเฉพาะนี้ ) ซึ่งรวมถึงการใช้ไฟล์. when(...)วิธีการ (การเรียกใช้ฟังก์ชันครั้งแรก):

app.config(function($urlRouterProvider){
  // when there is an empty route, redirect to /index   
  $urlRouterProvider.when('', '/index');

  // You can also use regex for the match parameter
  $urlRouterProvider.when(/aspx/i, '/index');
})
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.