Leiten Sie einen Status mit UI-Router in AngularJS auf den Standard-Unterstatus um

Lesezeit: 4 Minuten

Leiten Sie einen Status mit UI Router in AngularJS auf den
Löwe

Ich erstelle eine Registerkarten-basierte Seite, die einige Daten anzeigt. Ich verwende UI-Router in AngularJs, um Zustände zu registrieren.

Mein Ziel ist es, beim Laden der Seite einen Standard-Tab zu öffnen. Jede Registerkarte hat Unterregisterkarten, und ich möchte, dass beim Wechseln der Registerkarten eine Standard-Unterregisterkarte geöffnet wird.

Ich habe mit getestet onEnter Funktion und innen verwende ich $state.go('mainstate.substate'); aber es scheint aufgrund von Schleifeneffektproblemen nicht zu funktionieren (auf state.go to substate ruft es seinen übergeordneten Zustand auf und so weiter, und es verwandelt sich in eine Schleife).

$stateProvider

.state('main', {
  url: '/main',
  templateUrl: 'main.html',
  onEnter: function($state) {
    $state.go('main.street');
  }
})

.state('main.street', {
  url: '/street',
  templateUrl: 'submenu.html',
  params: {tabName: 'street'}
})

Hier habe ich eine erstellt Plunker-Demo.

Im Moment funktioniert alles, außer dass ich den Standard-Tab nicht geöffnet habe und genau das brauche ich.

Vielen Dank für Ihre Anregungen, Meinungen und Ideen.

Leiten Sie einen Status mit UI Router in AngularJS auf den
Radim Köhler

Aktualisieren:
1.0 und höher Unterstützt von vornherein RedirectTo.

https://ui-router.github.io/ng1/docs/latest/interfaces/state.statedeclaration.html#redirectto


ich erschuf ein Beispiel hier.

Diese Lösung stammt von einem netten “Kommentar” zu einem Problem mit der Verwendung von Umleitungen .when() (https://stackoverflow.com/a/27131114/1679310) und wirklich coole Lösung dafür (von Chris T, aber der ursprüngliche Beitrag war von yahyaKacem)

https://github.com/angular-ui/ui-router/issues/1584#issuecomment-75137373

Erweitern wir also zunächst main mit der Umleitungseinstellung:

$stateProvider
    .state('main', {
      url: '/main',
      templateUrl: 'main.html',
      redirectTo: 'main.street',
    })

Und fügen Sie nur diese paar Zeilen in run hinzu

app.run(['$rootScope', '$state', function($rootScope, $state) {

    $rootScope.$on('$stateChangeStart', function(evt, to, params) {
      if (to.redirectTo) {
        evt.preventDefault();
        $state.go(to.redirectTo, params, {location: 'replace'})
      }
    });
}]);

Auf diese Weise können wir jeden unserer Zustände mit seiner Standardumleitung anpassen … Überprüfen Sie es Hier

BEARBEITEN: Option aus Kommentar von @Alec hinzugefügt, um den Browserverlauf beizubehalten.

  • Dies scheint die Zurück-Taste zu schlagen.

    – Scott-Schwert

    26. Januar 2016 um 22:53 Uhr


  • @Swordfish0321 Um den Zurück-Button zu reparieren, nehmen Sie diese kleine Änderung vor: $state.go(to.redirectTo, params, {location: 'replace'}); Dadurch ersetzt der neue Status den vorherigen Status (dh den, von dem wir umgeleitet werden) im Verlauf. Siehe Dokumente für $state.go: angle-ui.github.io/ui-router/site/#/api/…

    – Alec

    25. April 2016 um 10:44 Uhr


  • Ich wollte nur hinzufügen, dass dies sehr nah an dem war, was ich tun wollte, aber ich wollte die Standard-URL, anstatt sie zu ersetzen, dies konnte leicht durch Ändern erreicht werden '$stateChangeStart' zu '$stateChangeSuccess'

    – Matti Preis

    9. Mai 2016 um 20:54 Uhr


  • ui-router 1.0 hat hierfür eine eingebaute Unterstützung: ui-router.github.io/guide/ng1/…

    – Gert-Jan

    24. August 2017 um 14:46 Uhr

Leiten Sie einen Status mit UI Router in AngularJS auf den
Löwe

In der Tat, auch wenn diese Lösung vorgeschlagen wird Radim hat genau den Job gemacht, ich musste mir die Unterregisterkarte (Status) jeder Registerkarte merken.

Also habe ich eine andere Lösung gefunden, die dasselbe tut, sich aber auch jeden Tab-Unterzustand merkt.

Ich musste nur noch installieren ui-router-extras und benutze die Deep-State-Umleitung Merkmal:

$stateProvider
  .state('main.street', {
     url: '/main/street',
     templateUrl: 'main.html',
     deepStateRedirect: { default: { state: 'main.street.cloud' } },
  });

Danke!

Ab Version 1.0 des ui-routers unterstützt es a redirectTo Eigentum. Zum Beispiel:

.state('A', {
  redirectTo: 'A.B'
})

Seit Version 1.0 von ui-router wurde ein Standard-Hook mit eingeführt IHookRegistry.onBefore() wie im Beispiel gezeigt Datengesteuerter Standard-Unterzustand in http://angular-ui.github.io/ui-router/feature-1.0/interfaces/transition.ihookregistry.html#onbefore

// state declaration
{
  name: 'home',
  template: '<div ui-view/>',
  defaultSubstate: 'home.dashboard'
}

var criteria = {
  to: function(state) {
    return state.defaultSubstate != null;
  }
}
$transitions.onBefore(criteria, function($transition$, $state) {
  return $state.target($transition$.to().defaultSubstate);
});

1645740910 278 Leiten Sie einen Status mit UI Router in AngularJS auf den
shubam yadav

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

    $urlRouterProvider.when("/state","/state/sub-state");

    })

  • Können Sie erklären, was das bewirkt und warum es besser ist als die bereits vorhandenen Antworten?

    – Equalsk

    28. Dezember 2017 um 10:32 Uhr

  • Diese Lösung ist die einfachste und hat für mich gut funktioniert.

    – BuffMcBigHuge

    19. Januar 2018 um 20:19 Uhr

  • Dies ist bei weitem die beste Antwort. Prägnanter als die Verwendung von Änderungsereignissen. Keine Notwendigkeit, Pakete hinzuzufügen. Ich weiß nicht, wieso das niemandem klar ist. Ich weiß nicht, wie die akzeptierte Antwort so hoch gestimmt wurde.

    – CodeWarrior

    14. November 2019 um 19:32 Uhr


Leiten Sie einen Status mit UI Router in AngularJS auf den
José Daniel Vivar Personat

Wenn jemand hierher kommt, um eine Antwort zu erhalten, wie man eine einfache Umleitung für einen Zustand implementiert, und wie es bei mir passiert ist, keine Möglichkeit hat, den neuen Router zu verwenden …

Offensichtlich ist die @bblackwo-Antwort wieder großartig, wenn Sie können:

$stateProvider.state('A', {
  redirectTo: 'B',
});

Wenn Sie es nicht können, leiten Sie es einfach manuell um:

$stateProvider.state('A', {
  controller: $state => {
    $state.go('B');
  },
});

Ich hoffe, es hilft!

  • Können Sie erklären, was das bewirkt und warum es besser ist als die bereits vorhandenen Antworten?

    – Equalsk

    28. Dezember 2017 um 10:32 Uhr

  • Diese Lösung ist die einfachste und hat für mich gut funktioniert.

    – BuffMcBigHuge

    19. Januar 2018 um 20:19 Uhr

  • Dies ist bei weitem die beste Antwort. Prägnanter als die Verwendung von Änderungsereignissen. Keine Notwendigkeit, Pakete hinzuzufügen. Ich weiß nicht, wieso das niemandem klar ist. Ich weiß nicht, wie die akzeptierte Antwort so hoch gestimmt wurde.

    – CodeWarrior

    14. November 2019 um 19:32 Uhr


847170cookie-checkLeiten Sie einen Status mit UI-Router in AngularJS auf den Standard-Unterstatus um

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy