Ich habe ein Problem beim Ändern der URL der Seite, nachdem ein Formular gesendet wurde.
Hier ist der Ablauf meiner App:
- Routen werden festgelegt, URL wird zu einer Formularseite erkannt.
- Seiten wird geladen, Controller setzt Variablen, Direktiven werden ausgelöst.
- Es wird eine spezielle Formularanweisung ausgelöst, die eine spezielle Formularübermittlung mit AJAX durchführt.
- Nachdem der AJAX ausgeführt wurde (Angular kümmert sich nicht um den AJAX), wird ein Rückruf ausgelöst und die Direktive ruft die
$scope.onAfterSubmit
Funktion auf, die den Speicherort festlegt.
Das Problem ist, dass nach dem Festlegen des Standorts nichts passiert. Ich habe auch versucht, den Standortparameter auf /
... Nein. Ich habe auch versucht, das Formular nicht einzureichen. Nichts funktioniert.
Ich habe getestet, ob der Code die onAfterSubmit
Funktion erreicht (was er tut).
Mein einziger Gedanke ist, dass sich der Umfang der Funktion irgendwie ändert (da sie von einer Direktive aufgerufen wird), aber wie kann sie dann wieder aufgerufen werden? onAfterSubmit
wenn sich der Umfang ändert?
Hier ist mein Code
var Ctrl = function($scope, $location, $http) {
$http.get('/resources/' + $params.id + '/edit.json').success(function(data) {
$scope.resource = data;
});
$scope.onAfterSubmit = function() {
$location.path('/').replace();
};
}
Ctrl.$inject = ['$scope','$location','$http'];
Kann mir bitte jemand helfen?
Antworten:
Ich hatte vor einigen Tagen ein ähnliches Problem. In meinem Fall bestand das Problem darin, dass ich Dinge mit einer Bibliothek eines Drittanbieters geändert habe (um genau zu sein jQuery), und in diesem Fall erkennt Angular nicht immer, dass es Änderungen gibt, obwohl es das Aufrufen von Funktionen und das Setzen von Variablen funktioniert, sodass es niemals verdaut.
Versuchen Sie,
$scope.$apply()
direkt zu verwenden, nachdem Sie den Standort geändert undreplace()
Angular darüber informiert haben, dass sich die Dinge geändert haben.quelle
Anstatt
$location.path(...)
die Seite zu ändern oder zu aktualisieren, habe ich den Dienst verwendet$window
. In Angular wird dieser Dienst als Schnittstelle zumwindow
Objekt verwendet, und daswindow
Objekt enthält eine Eigenschaftlocation
, mit der Sie Vorgänge ausführen können, die sich auf den Speicherort oder das URL-Material beziehen.Mit können Sie beispielsweise
window.location
eine neue Seite wie folgt zuweisen:Oder aktualisieren Sie es wie folgt:
Es hat bei mir funktioniert. Es ist ein bisschen anders als erwartet, funktioniert aber für das vorgegebene Ziel.
quelle
Ich hatte das gleiche Problem, aber mein Anruf bei $ location war BEREITS innerhalb eines Digests. Das Aufrufen von $ apply () ergab nur einen $ Digest, der bereits einen Prozessfehler aufwies.
Dieser Trick hat funktioniert (und muss unbedingt
$location
in Ihren Controller injiziert werden):Obwohl keine Ahnung, warum dies notwendig war ...
quelle
Ich musste meine
$location.path()
Aussage so einbetten, weil mein Digest noch lief:quelle
In meinem Fall war das Problem, dass der optionale Parameterindikator ('?') In meiner Vorlagenkonfiguration fehlte.
Beispielsweise:
Ohne das Abfragezeichen würde sich die Route offensichtlich nicht ändern, indem der Routenparameter unterdrückt wird.
quelle
Wenn einer von Ihnen den Angular-ui / ui-Router verwendet, verwenden Sie:
$state.go('yourstate')
anstelle von$location
. Es hat den Trick für mich getan.quelle
Das funktioniert für mich (in CoffeeScript)
quelle
Meiner Meinung nach scheinen viele der Antworten hier etwas hackig zu sein (z. B. $ apply () oder $ timeout), da das Herumspielen mit $ apply () zu unerwünschten Fehlern führen kann.
Wenn der $ -Standort nicht funktioniert, bedeutet dies normalerweise, dass etwas nicht im Winkel implementiert wurde.
In dieser speziellen Frage scheint das Problem im nicht eckigen AJAX-Teil zu liegen. Ich hatte ein ähnliches Problem, bei dem die Umleitung unter Verwendung von $ location erfolgen sollte, nachdem ein Versprechen gelöst wurde. Ich möchte das Problem an diesem Beispiel veranschaulichen.
Der alte Code:
Hinweis: taskService.createTask gibt ein Versprechen zurück.
$ q - die eckige Art, Versprechen zu verwenden:
Die Verwendung von $ q zur Lösung des Versprechens löste das Umleitungsproblem.
Weitere Informationen zum $ q-Service: https://docs.angularjs.org/api/ng/service/ $ q
quelle
es sollte dein Problem lösen.
quelle