Derzeit verwendet unser Projekt die Standardeinstellung $routeProvider
, und ich verwende diesen "Hack", um Änderungen url
vorzunehmen, ohne die Seite neu zu laden:
services.service('$locationEx', ['$location', '$route', '$rootScope', function($location, $route, $rootScope) {
$location.skipReload = function () {
var lastRoute = $route.current;
var un = $rootScope.$on('$locationChangeSuccess', function () {
$route.current = lastRoute;
un();
});
return $location;
};
return $location;
}]);
und in controller
$locationEx.skipReload().path("/category/" + $scope.model.id).replace();
Ich denke dabei an Ersatz routeProvider
mit ui-router
für die Verschachtelung Strecken, kann aber nicht mit diesen in finden ui-router
.
Ist es möglich - machen Sie dasselbe mit angular-ui-router
?
Warum brauche ich das? Lassen Sie mich anhand eines Beispiels erklären: Die
Route zum Erstellen einer neuen Kategorie ist /category/new
nach clicking
SAVE, die ich zeige, success-alert
und ich möchte die Route ändern /category/new
zu /caterogy/23
(23 - ist die ID des neuen Elements, das in db gespeichert ist).
angularjs
angular-ui-router
vuliad
quelle
quelle
$urlRouterProvider.otherwise
scheint, als würde eine URL verwendet, kein Status. Hmmm, vielleicht könnte ich mit 2 URLs leben oder einen anderen Weg finden, um anzuzeigen, dass es sich um eine ungültige URL handelt.Antworten:
Einfach können Sie
$state.transitionTo
anstelle von verwenden$state.go
.$state.go
ruft$state.transitionTo
intern auf, setzt aber automatisch Optionen auf{ location: true, inherit: true, relative: $state.$current, notify: true }
. Sie können anrufen$state.transitionTo
und einstellennotify: false
. Beispielsweise:kann ersetzt werden durch
Edit: Wie von fracz vorgeschlagen, kann es einfach sein:
quelle
$state.transitionTo('.detail', {id: newId}, { location: true, inherit: true, relative: $state.$current, notify: false })
also im Grunde genommen notify auf false und location auf true setzen$state.go('.detail', {id: newId}, {notify: false})
.Ok, gelöst :) Angular UI Router hat diese neue Methode, $ urlRouterProvider.deferIntercept () https://github.com/angular-ui/ui-router/issues/64
Im Grunde kommt es darauf an:
Ich denke, diese Methode ist derzeit nur in der Master- Version des eckigen UI-Routers enthalten, der mit optionalen Parametern (die übrigens auch nett sind). Es muss geklont und von der Quelle mit erstellt werden
Auf die Dokumente kann auch von der Quelle aus zugegriffen werden
(Sie werden in das Verzeichnis / site integriert.) // Weitere Informationen in README.MD
Es scheint einen anderen Weg zu geben, dies durch dynamische Parameter (die ich nicht verwendet habe) zu tun . Viele Kredite an Nateabele.
Als Nebenbemerkung sind hier optionale Parameter im $ stateProvider von Angular UI Router aufgeführt, die ich in Kombination mit den oben genannten verwendet habe:
Dadurch kann ein Status aufgelöst werden, auch wenn einer der Parameter fehlt. SEO ist ein Zweck, Lesbarkeit ein anderer.
Im obigen Beispiel wollte ich, dass doorSingle ein erforderlicher Parameter ist. Es ist nicht klar, wie diese definiert werden sollen. Es funktioniert gut mit mehreren optionalen Parametern, also kein wirkliches Problem. Die Diskussion ist hier https://github.com/angular-ui/ui-router/pull/1032#issuecomment-49196090
quelle
Error: Both params and url specicified in state 'state'
. In den Dokumenten heißt es, dass dies auch eine ungültige Verwendung ist. Ein bisschen enttäuschend.Nachdem ich viel Zeit mit diesem Thema verbracht habe, habe ich Folgendes getan
quelle
ui-router
nur gestellt, wie kann man das sagen, andere Lösungen haben funktioniert$routerProvider
,$routeProvider
&$stateProvider
ist völlig verschieden in der Architektur ..$onInit()
als würde meine Komponente jedes Mal aufgerufen, wenn ich das verwende$state.go
. Scheint mir nicht 100% in Ordnung zu sein.Berufung
lädt den Controller weiterhin neu.
Um dies zu vermeiden, müssen Sie den Parameter als dynamisch deklarieren:
Dann brauchen Sie nicht einmal das
notify
, nur anrufengenügt. Neato!
Aus der Dokumentation :
quelle
Dieses Setup löste folgende Probleme für mich:
.../
bis nicht zweimal aufgerufen.../123
Statuskonfiguration
Aufrufen der Status (von einem anderen Controller)
Schulungsleiter
quelle
Wenn Sie nur die URL ändern müssen, aber den Änderungsstatus verhindern möchten:
Ändern Sie den Speicherort mit (fügen Sie .replace hinzu, wenn Sie im Verlauf ersetzen möchten):
Verhindern Sie die Weiterleitung in Ihren Bundesstaat:
quelle
Ich habe dies aber vor langer Zeit in Version: v0.2.10 von UI-Router wie so etwas getan ::
quelle
Versuchen Sie so etwas
quelle
Ich glaube nicht, dass Sie dafür einen UI-Router brauchen. Die für den $ location-Service verfügbare Dokumentation heißt es im ersten Absatz: "... Änderungen an $ location werden in der Adressleiste des Browsers angezeigt." Später heißt es weiter: "Was macht es nicht? Es verursacht kein erneutes Laden der gesamten Seite, wenn die Browser-URL geändert wird."
In diesem Sinne sollten Sie den $ location.path (da die Methode sowohl ein Getter als auch ein Setter ist) einfach wie folgt ändern:
In der Dokumentation wird darauf hingewiesen, dass der Pfad immer mit einem Schrägstrich beginnen sollte, der jedoch hinzugefügt wird, wenn er fehlt.
quelle
ui-router
und verwende$location.path(URL_PATH)
, wird sie automatisch neu gerendert?!