Estou com um problema ao alterar o URL da página após o envio de um formulário.
Aqui está o fluxo do meu aplicativo:
- As rotas são definidas, o URL é reconhecido em alguma página do formulário.
- Página carrega, controlador define variáveis, diretivas são acionadas.
- Uma diretiva de formulário especial é acionada que executa um envio de formulário especial usando AJAX.
- Depois que o AJAX é executado (o Angular não cuida do AJAX), um retorno de chamada é acionado e a diretiva chama a
$scope.onAfterSubmit
função que define o local.
O problema é que, depois de definir o local, nada acontece. Eu tentei definir o parâmetro de localização /
também ... Não. Também tentei não enviar o formulário. Nada funciona.
Eu testei para ver se o código atinge a onAfterSubmit
função (o que faz).
Meu único pensamento é que, de alguma forma, o escopo da função é alterado (desde que é chamado de uma diretiva), mas, novamente, como ele pode chamar onAfterSubmit
se o escopo foi alterado?
Aqui está o 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, se faz favor?
Respostas:
Eu tive um problema semelhante há alguns dias. No meu caso, o problema era que eu mudei as coisas com uma biblioteca de terceiros (jQuery para ser mais preciso) e, nesse caso, embora chamar funções e definir variáveis funcionem, o Angular nem sempre reconhece que há alterações, portanto, nunca é digerido.
Tente usar
$scope.$apply()
logo após alterar o local e ligarreplace()
para avisar a Angular que as coisas mudaram.fonte
Em vez de
$location.path(...)
alterar ou atualizar a página, usei o serviço$window
. No Angular, esse serviço é usado como interface para owindow
objeto e owindow
objeto contém uma propriedadelocation
que permite lidar com operações relacionadas ao local ou ao material da URL.Por exemplo,
window.location
você pode atribuir uma nova página, assim:Ou atualize-o assim:
Funcionou para mim. É um pouco diferente do esperado, mas funciona para o objetivo especificado.
fonte
Eu tive esse mesmo problema, mas minha ligação para $ location JÁ estava dentro de um resumo. Chamar $ apply () acabou de fornecer um $ digest já em erro no processo.
Este truque funcionou (e certifique-se de injetar
$location
no seu controlador):Embora nenhuma idéia do por que isso era necessário ...
fonte
Eu tive que incorporar minha
$location.path()
declaração assim porque meu resumo ainda estava sendo executado:fonte
No meu caso, o problema era o indicador de parâmetro opcional ('?') Ausente na minha configuração de modelo.
Por exemplo:
Sem o caractere de interrogação, a rota obviamente não mudaria suprimindo o parâmetro de rota.
fonte
Se algum de vocês estiver usando o Angular-ui / ui-router, use: em
$state.go('yourstate')
vez de$location
. Isso fez o truque para mim.fonte
Isso funciona para mim (no CoffeeScript)
fonte
Na minha opinião, muitas das respostas aqui parecem um pouco hacky (por exemplo, $ apply () ou $ timeout), uma vez que mexer com $ apply () pode levar a erros indesejados.
Normalmente, quando o local $ não funciona, significa que algo não foi implementado da maneira angular.
Nesta questão em particular, o problema parece estar na parte AJAX não angular. Eu tive um problema semelhante, em que o redirecionamento usando $ location deveria ocorrer após a promessa ser resolvida. Eu gostaria de ilustrar o problema neste exemplo.
O código antigo:
Nota: taskService.createTask retorna uma promessa.
$ q - a maneira angular de usar promessas:
O uso de $ q para resolver a promessa resolveu o problema de redirecionamento.
Mais informações sobre o serviço $ q: https://docs.angularjs.org/api/ng/service/ $ q
fonte
isso deve resolver seu problema.
fonte