AngularJS $ localização não alterando o caminho

Estou com um problema ao alterar o URL da página depois que um formulário foi enviado.

Aqui está o stream do meu aplicativo:

  1. Rotas são definidas, o URL é reconhecido em alguma página de formulário.
  2. Carregamentos de página, variables ​​de conjuntos de controle, diretivas são triggersdas.
  3. Uma diretiva de formulário especial é acionada e executa um envio de formulário especial usando o AJAX.
  4. Depois que o AJAX é executado (o Angular não cuida do AJAX), um callback é triggersdo e a diretiva chama a function $scope.onAfterSubmit , que define o local.

O problema é que depois de definir a localização, nada acontece. Eu tentei definir o parâmetro de localização para / bem … Não. Eu também tentei não enviar o formulário. Nada funciona.

Eu testei para ver se o código atinge a function onAfterSubmit (o que faz).

Meu único pensamento é que, de alguma forma, o escopo da function é alterado (desde a sua chamada de uma diretiva), mas, novamente, como ele pode chamar onAfterSubmit se o escopo mudou?

Aqui está meu 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']; 

Alguém me pode ajudar por favor?

Eu tive um problema parecido alguns dias atrás. No meu caso, o problema foi que eu mudei as coisas com uma biblioteca de terceiros (jQuery para ser preciso) e, neste caso, mesmo chamando funções e definindo variables ​​trabalha Angular nem sempre reconhece que há mudanças, portanto, nunca digere.

$ apply () é usado para executar uma expressão em angular de fora da estrutura angular. (Por exemplo, de events do navegador DOM, bibliotecas setTimeout, XHR ou de terceiros).

Tente usar o $scope.$apply() logo depois de ter alterado o local e chamado replace() para informar ao Angular que as coisas mudaram.

Em vez de $ location.path (…) para alterar ou atualizar a página, usei a $window service, em Angular, esse serviço é usado como interface para o object window e o object window contém um location propriedade que permite manipular operações relacionadas à localização ou ao material do URL.

Por exemplo, com window.location você pode atribuir uma nova página, como esta:

 $window.location.assign('/'); 

Ou atualize-o assim:

 $window.location.reload(); 

Isso funcionou para mim. É um pouco diferente do que você espera, mas funciona para o objective determinado.

Eu tive esse mesmo problema, mas minha chamada para $ location já estava dentro de um resumo. Chamar $ apply () acabou de fornecer um $ digest já em erro de processo.

Este truque funcionou (e certifique-se de injetar $location em seu controlador):

 $timeout(function(){ $location... },1); 

Embora não tenha ideia de por que isso foi necessário …

Eu tive que incorporar minha instrução $location.path() assim porque meu resumo ainda estava em execução:

  function routeMe(data) { var waitForRender = function () { if ($http.pendingRequests.length > 0) { $timeout(waitForRender); } else { $location.path(data); } }; $timeout(waitForRender); } 

No meu caso, o problema era o indicador de parâmetro opcional (‘?’) Ausente na configuração do meu modelo.

Por exemplo:

 .when('/abc/:id?', { templateUrl: 'views/abc.html', controller: 'abcControl' }) $location.path('/abc'); 

Sem o caractere de interrogação, a rota obviamente não mudaria de suprimir o parâmetro de rota.

Se algum de vocês estiver usando o roteador Angular-ui / ui, use: $state.go('yourstate') vez de $location . Foi o truque para mim.

Isso funciona para mim (no CoffeeScript)

  $location.path '/url/path' $scope.$apply() if (!$scope.$$phase) 
 setTimeout(function() { $location.path("/abc"); },0); 

isso deve resolver seu problema.