ejemplos - instalar angularjs
La ubicaciĆ³n AngularJS $ no cambia la ruta (8)
Tengo un problema con el cambio de la URL de la página después de que se haya enviado un formulario.
Aquí está el flujo de mi aplicación:
- Las rutas se establecen, la URL se reconoce en alguna página de formulario.
- Cargas de página, controlador establece variables, las directivas se disparan.
- Se dispara una directiva de formulario especial que realiza una presentación de formulario especial utilizando AJAX.
- Después de que se realiza el AJAX (Angular no se ocupa de AJAX) se
$scope.onAfterSubmit
una devolución de llamada y la directiva llama a la función$scope.onAfterSubmit
que establece la ubicación.
El problema es que después de establecer la ubicación, no pasa nada. Intenté configurar el parámetro de ubicación en /
también ... No. También intenté no enviar el formulario. Nada funciona.
He probado para ver si el código alcanza la función onAfterSubmit
(que lo hace).
Mi único pensamiento es que de alguna manera el alcance de la función se cambia (ya que se llama desde una directiva), pero de nuevo ¿cómo puede invocar a 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?
En lugar de $ location.path (...) para cambiar o actualizar la página utilicé la $window
servicio, en Angular este servicio se usa como interfaz para el objeto de window
, y el objeto de window
contiene una location
propiedad que le permite manejar operaciones relacionadas con la ubicación o material de URL.
Por ejemplo, con window.location
puede asignar una nueva página, como esta:
$window.location.assign(''/'');
O renuévalo, así:
$window.location.reload();
Funcionó para mí Es un poco diferente de lo que espera pero funciona para el objetivo dado.
En mi caso, el problema era que faltaba el indicador de parámetro opcional (''?'') En la configuración de mi plantilla.
Por ejemplo:
.when(''/abc/:id?'', {
templateUrl: ''views/abc.html'',
controller: ''abcControl''
})
$location.path(''/abc'');
Sin el carácter de interrogación, la ruta obviamente no cambiaría suprimiendo el parámetro de ruta.
Esto funciona para mí (en CoffeeScript)
$location.path ''/url/path''
$scope.$apply() if (!$scope.$$phase)
Si alguno de ustedes está usando Angular-ui / ui-enrutador, use: $state.go(''yourstate'')
lugar de $location
. Me hizo el truco.
Tuve el mismo problema, pero mi llamada a $ location YA estaba dentro de un resumen. Llamar $ apply () acaba de dar un $ digest ya en proceso de error.
Este truco funcionó (y asegúrese de inyectar $location
en su controlador):
$timeout(function(){
$location...
},1);
Aunque no tenía idea de por qué esto era necesario ...
Tuve que incrustar mi declaración $location.path()
esta manera porque mi resumen aún se estaba ejecutando:
function routeMe(data) {
var waitForRender = function () {
if ($http.pendingRequests.length > 0) {
$timeout(waitForRender);
} else {
$location.path(data);
}
};
$timeout(waitForRender);
}
Tuve un problema similar hace algunos días. En mi caso, el problema fue que cambié cosas con una biblioteca de terceros (jQuery para ser preciso) y en este caso, aunque las funciones de llamada y la configuración de las variables funcionan, Angular no siempre reconoce que hay cambios, por lo que nunca se digiere.
$ apply () se usa para ejecutar una expresión en angular desde fuera del marco angular. (Por ejemplo, desde los eventos DOM del navegador, setTimeout, XHR o bibliotecas de terceros).
Intente usar $scope.$apply()
justo después de haber cambiado la ubicación y llamado replace()
para que Angular sepa que las cosas han cambiado.
setTimeout(function() { $location.path("/abc"); },0);
debería resolver tu problema.