2014-05-02 5 views
7

Ich habe ein ärgerliches Problem in Bezug auf ui-router. Alles funktioniert wie ich will, wo alle schlechten URLs an den 404 Status gesendet werden. Obwohl mein Standardstatus ordnungsgemäß wiedergegeben wird, wenn die URL /#/ ist, wird die URL von / jedoch an /404/ umgeleitet. Wie kann ich den default-Status sowohl auf / als auch auf /#/ Serverserver?Angular UI-Router senden Root-URL zu 404

app.js

MyApp.config(function ($stateProvider, $urlRouterProvider) { 

// For any unmatched url, send to 404 
$urlRouterProvider.otherwise("/404/"); 

$stateProvider 
    // Home (default) 
    .state('default', { 
     url: '/', 
     resolve: { 
      ... 
     }, 
    } 
}); 

Jede Hilfe sehr geschätzt.

+0

Kann ich mit meiner Antwort Ihre Probleme lösen? – Ross

Antwort

11

Ich denke, das Ihre Bedürfnisse erreichen wird -

MyApp.config(function($stateProvider, $urlRouterProvider) { 
    // the known route 
    $urlRouterProvider.when('', '/'); 

    // For any unmatched url, send to 404 
    $urlRouterProvider.otherwise('/404'); 

    $stateProvider 
     // Home (default) 
     .state('default', { 
      url: '/', 
      resolve: { 
       // ... 
      } 
      // .... 
     }); 
}); 

ich this post refered. Sie müssen möglicherweise einen regulären Ausdruck verwenden, um Routen mit Daten zu behandeln.

Anstelle der in Ihrer URL können Sie auch eine Abfragezeichenfolge verwenden und sie über $stateParams in einem Zustand greifen.

Hier ist, wie Sie das tun können -

// .... 

    $stateProvider 

    .state('default', { 
     url: '/?data', 
     templateUrl: 'templates/index.html', 
     controller: 'defaultCtrl' 
    }) 

Und dann können Sie dies unten verwenden, um zu Hause mit Daten zu gehen -

var toStateData = { 
    key1: 'value1', 
    key2: 'value2' 
} 

$state.go('default', {data: JSON.stringify(toStateData)}); 

Sie müssen die Daten nicht stringify in $stateParams, aber dies wird mehr Optionen mit einem Parameter ermöglichen. Im defaultCtrl Controller können Sie den übergebene Abfrage-String wie diese erhalten -

var stateData = JSON.parse($stateParams.data); 
var key1 = stateData.key1; 
// .... 
+1

Hey, danke, dass du mich in die richtige Richtung gebracht hast - hab nicht gemerkt, dass '.when' einen Alias ​​enthält. Allerdings ist mein Anwendungsfall tatsächlich umgekehrt. Wenn die base '/' url gefunden wird, brauche ich einen Alias ​​für '/ # /' (''' und' '/' 'im Status-Router). Wenn Sie Ihre Antwort anpassen, werde ich gerne akzeptieren;) –

+1

Das was ich hinzugefügt: '$ urlRouterProvider.when ('', '/');' –

+0

@DarwinTech Hey ich aktualisierte die Antwort, froh, dass es geholfen hat. – Ross

2

ich dies nur mit Staaten tun wollte, so dass kein URL-Anbieter beteiligt. Ich fand die folgende Lösung, die ich gut finde:

(sorry, es ist Coffeescript)

$stateProvider. 
    state('base.public.notFound', 
     url:   '^*path' 
     templateUrl: 'views/layouts/404.html' 
    ) 

Setzen Sie diese als letzter Staat und Sie sind fertig!

+1

Ich möchte darauf hinweisen, dass dies aus irgendeinem Grund für mich nicht funktioniert hat. –

+0

Ich kenne Ihren Code nicht, aber mit diesem sollten Sie nicht den '.otherwise'- oder solchen, einzigen Stateprovider verwenden. –

Verwandte Themen