Nếu không thì trên StateProvider


Câu trả lời:


123

Bạn không thể chỉ sử dụng $stateProvider.

Bạn cần nhập $urlRouterProvidervà tạo mã tương tự như:

$urlRouterProvider.otherwise('/otherwise');

Các /otherwiseurl phải được xác định trên một trạng thái như bình thường:

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

Xem liên kết này nơi ksperling giải thích


Bạn thực sự có thể sử dụng $stateProvider. Sẽ ít công việc hơn nếu bạn chỉ muốn hiển thị một mẫu, nhưng không chuyển hướng. Tôi thích câu trả lời của @ juan-hernandez hơn.
Weltschmerz

giá trị được truyền tới otherwise(trong trường hợp này '/otherwise') có phải khớp với tên của trạng thái (tham số đầu tiên đến .state) hay giá trị cho urltùy chọn không?
d512

Tính năng này hiện không được dùng nữa - xem câu trả lời từ @babyburger
Vedran

81

Bạn có thể $stateProvidersử dụng cú pháp catch all ( "*path"). Bạn chỉ cần thêm cấu hình trạng thái ở cuối danh sách của mình như sau:

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

Tất cả các tùy chọn được giải thích trong https://github.com/angular-ui/ui-router/wiki/URL-Routing#regex-parameters .

Điều tốt đẹp của tùy chọn này, trái ngược với $urlRouterProvider.otherwise(...), là bạn không bị buộc phải thay đổi vị trí.


bạn có thể vui lòng giải thích you're not forced to a location change:?
Kevin Meredith

1
Ý của anh ấy là url sẽ giữ nguyên như cũ. Vì vậy, nếu người dùng truy cập /this/does/not/exist, thì URL sẽ giữ nguyên như vậy trong thanh địa chỉ. Giải pháp khác sẽ đưa bạn đến/otherwise
Matt Greer

Tôi đã sử dụng giải pháp của bạn và nó đã hoạt động (tôi có thể giữ lại url không được tìm thấy, điều này thật tuyệt vì tôi đang sử dụng luisfarzati.github.io/angulartics và bằng cách này, tôi cũng có thể xem điều hướng đến các trang không được tìm thấy) cho các trường hợp khi url mà người dùng điều hướng đến không tồn tại. Tuy nhiên, nếu tôi điều hướng đến url này bằng cách sử dụng $ state.go ('nếu không') bên trong bộ điều khiển, tôi sẽ mất url. Tôi điều hướng rõ ràng đến trạng thái này khi người dùng truy cập trang chi tiết của một mục và máy chủ trả về 404 (ví dụ: nếu mục đã bị xóa). Bạn có biết một cách để khắc phục điều này?
pcatre

@pcatre, bạn có thể sử dụng option location = false và url sẽ không thay đổi. Ví dụ. $ state.go ('nếu không', {}, {location: false})
JakubKnejzlik

35

Bạn cũng có thể đưa $ state vào một hàm khác theo cách thủ công, sau đó bạn có thể điều hướng đến trạng thái không phải url. Điều này có lợi là trình duyệt không thay đổi thanh địa chỉ, điều này rất hữu ích để xử lý việc quay lại trang trước.

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

mà giải quyết vấn đề của tôi về cách kiểm tra nếu chúng ta giữa ứng dụng hoặc onload khi khác được sử dụng - cảm ơn bạn rất nhiều :)
Jörn Berkefeld

bạn đã cứu ngày của tôi!
Maelig

Đừng quên nếu bạn muốn giảm thiểu điều này, bạn cần $ tiêm
Sten Muchow

3

Được rồi, khoảnh khắc ngớ ngẩn khi bạn nhận ra rằng câu hỏi bạn hỏi đã được trả lời trong những dòng đầu tiên của mã mẫu! Chỉ cần xem qua mã mẫu.

       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 ! 


          ....

Hãy xem ở đây.


3

Tôi chỉ muốn nghe những câu trả lời tuyệt vời đã được cung cấp. Phiên bản mới nhất của đã @uirouter/angularjsđánh dấu lớp UrlRouterProviderlà không được dùng nữa. Bây giờ họ khuyên bạn nên sử dụng UrlServicethay thế. Bạn có thể đạt được kết quả tương tự với sửa đổi sau:

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

Các phương pháp bổ sung: https://ui-router.github.io/ng1/docs/1.0.16/interfaces/url.urlrulesapi.html


0

Các tham chiếu câu trả lời được chấp nhậnangular-route hỏi về ui-router. Câu trả lời được chấp nhận sử dụng "nguyên khối" $routeProvider , yêu cầu ngRoutemô-đun (trong khi ui-routercần ui.routermô-đun)

Các câu trả lời đánh giá cao nhất sử dụng $stateProviderthay vào đó, và nói điều gì đó giống như .state("otherwise", { url : '/otherwise'... }), nhưng tôi không thể tìm thấy bất kỳ đề cập đến "khác" trong tài liệu nó liên kết . Tuy nhiên, tôi thấy điều đó $stateProviderđược đề cập trong câu trả lời này khi nó nói:

Bạn không thể chỉ sử dụng $stateProvider. Bạn cần tiêm$urlRouterProvider

Đó là nơi câu trả lời của tôi có thể giúp bạn. Đối với tôi, $urlRouterProviderchỉ cần sử dụng như thế này là đủ :

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

Đề xuất của tôi phù hợp với ui-router tài liệu , ( bản sửa đổi cụ thể này ), trong đó nó bao gồm cách sử dụng tương tự của. when(...)(lệnh gọi hàm đầu tiên):

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');
})
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.