Tengo un problema para cambiar la URL de la página después de enviar un formulario.
Aquí está el flujo de mi aplicación:
- Las rutas están configuradas, la URL se reconoce en alguna página de formulario.
- La página se carga, el controlador establece variables, las directivas se activan.
- Se activa una directiva de formulario especial que realiza un envío de formulario especial utilizando AJAX.
- Después de que se realiza el AJAX (Angular no se ocupa del AJAX), se activa una devolución de llamada y la directiva llama a la
$scope.onAfterSubmit
función que establece la ubicación.
El problema es que después de configurar la ubicación no pasa nada. También he intentado configurar el parámetro de ubicación /
... No. También he intentado no enviar el formulario. Nada funciona.
He probado para ver si el código alcanza la onAfterSubmit
función (lo que hace).
Mi único pensamiento es que de alguna manera se cambia el alcance de la función (ya que se llama desde una directiva), pero, de nuevo, ¿cómo se puede llamar onAfterSubmit
si el alcance cambió?
Aquí está mi código
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'];
alguien me puede ayudar por favor?
Respuestas:
Tuve un problema similar hace unos días. En mi caso, el problema fue que cambié las cosas con una biblioteca de terceros (jQuery para ser precisos) y en este caso, aunque llamar a funciones y configurar variables funciona Angular no siempre reconoce que hay cambios, por lo que nunca digiere.
Intente usarlo
$scope.$apply()
inmediatamente después de haber cambiado la ubicación y haber llamadoreplace()
para que Angular sepa que las cosas han cambiado.fuente
En lugar de
$location.path(...)
cambiar o actualizar la página, utilicé el servicio$window
. En Angular, este servicio se utiliza como interfaz para elwindow
objeto, y elwindow
objeto contiene una propiedadlocation
que le permite manejar operaciones relacionadas con la ubicación o las cosas de URL.Por ejemplo, con
window.location
usted puede asignar una nueva página, como esta:O actualizarlo, así:
Funcionó para mi. Es un poco diferente de lo que espera pero funciona para el objetivo dado.
fuente
Tuve el mismo problema, pero mi llamada a $ location YA estaba dentro de un resumen. Llamar a $ apply () acaba de dar un resumen de $ ya en error de proceso.
Este truco funcionó (y asegúrese de inyectar
$location
en su controlador):Aunque no tengo idea de por qué esto era necesario ...
fuente
Tuve que incrustar mi
$location.path()
declaración de esta manera porque mi resumen todavía se estaba ejecutando:fuente
En mi caso, el problema era que faltaba el indicador de parámetro opcional ('?') En la configuración de mi plantilla.
Por ejemplo:
Sin el carácter de interrogación, la ruta obviamente no cambiaría suprimiendo el parámetro de ruta.
fuente
Si alguno de ustedes está usando Angular-ui / ui-router, use: en
$state.go('yourstate')
lugar de$location
. Fue el truco para mí.fuente
Esto funciona para mí (en CoffeeScript)
fuente
En mi opinión, muchas de las respuestas aquí parecen un poco extravagantes (por ejemplo, $ apply () o $ timeout), ya que jugar con $ apply () puede provocar errores no deseados.
Por lo general, cuando la ubicación $ no funciona, significa que algo no se implementó de forma angular.
En esta pregunta en particular, el problema parece estar en la parte no angular de AJAX. Tuve un problema similar, donde la redirección usando $ location debería tener lugar después de que se resuelva una promesa. Me gustaría ilustrar el problema en este ejemplo.
El viejo código:
Nota: taskService.createTask devuelve una promesa.
$ q: la forma angular de usar promesas:
El uso de $ q para resolver la promesa resolvió el problema de redirección.
Más sobre el servicio $ q: https://docs.angularjs.org/api/ng/service/ $ q
fuente
debería resolver tu problema.
fuente