Solucionado (ver solução)
Solucionado
(ver solução)
5
respostas

2x rota não roda/faz o que está dentro do controller

Professor, estou com uma dúvida e ao mesmo tempo problema digamos assim, a questão é que...

  • Quando acesso pela 1x a rota : meusite.com/#sobre , e dentro da mesma tem um controller e nesse controller eu chamo uma function, onde ela me busca algo no meu back-end, funciona perfeitamente pela 1x.

  • Já na rota aberta #sobre , quando pela 2x eu clico na rota : meusite.com/#sobre , ele não roda ou não faz nada que está dentro do controller, somente se eu sair da rota para outra qualquer e voltar a clicar na rota #/sobre ele faz o que está dentro do controller.

Isso vale para qualquer item da rota, eu acredito que uma vez aberta a rota e feito que estiver dentro do controller, se tentar acessar o mesmo novamente onde já se encontra aberto, ele nada faz.

Existe alguma forma de fazer o controller rodar tudo que está dentro dele, mesmo se eu já estiver na rota especifica aberta e clicar 1, 2, 3, 4,5+ ?

  • Pois para entender bem o meu problema é o seguinte...

    tenho uma página da qual eu fiz um "modal/loading" enquanto ainda está carregando, e esse loading ele só sai quando o controller do destino é carregado, porém quando o controller já está carregado e tento acessar a mesma página, ele dá esse BUG de rodar o "loading" mas não conseguir fechar porque o controller não foi "re-executado" novamente, por isso de alguma solução em fazer o controller rodar indefinida vezes mesmo se já estiver aberto ( quando for chamado pela sua rota /#sobre - /#contato - /#home

5 respostas

Olá Nleal! Você poderia postar algum código para esclarecer um pouco mais? Pelo que entendi você gostaria de chamar o ng-init sempre que clicar na rota, seria isso? Talvez a função $watch possa ajudar.

Opa, vamos la...

  • rotas.js
app.config( function($routeProvider){

    $routeProvider.otherwise({ redirectTo: '/home'});

    $routeProvider
    .when('/sobre', {
        templateUrl: 'sobre.html',
        controller: 'sobreCtrl'
    });

});
  • sobreCtrl.js
app.controller('sobreCtrl', function($scope){

$scope.funcaoTeste();

$scope.funcaoTeste = function(){
    console.log('a função abriu porque entrou no controller sobreCtrl');
};

}):
  • O problema ai é que, quando eu entro pela 1x na roda : site.com/#sobre , ele roda essa função porque estou chamando ela ali encima, porém, se eu já estiver na roda sobreCtrl atualmente ( da qual já foi aberta ) e tento "clicar novamente na url pra re-acessar" esse controller sobreCtrl, ao clicar ele deveria novamente ( rodar todo o controller ) porém ele não faz, assim pela 2x clicada ele não roda a função ai dentro do controller sobreCtrl.
  • Claro que, se eu entrar 1x em /#sobre e ir para /#contato ou outra rota e depois voltar em /#sobre ele vai abrir porque eu sai desse controller que estava /#sobre e fui para outro, e depois voltei, então ele sabe que no momento em que eu estava em /#contato o controller do contato que estava aberto/sendo acessado.
  • [ O que queria ]

    Era realmente conseguir que o controller fosse executado quantas X eu clicar nessa rota /#sobre, independente de eu já estar nessa rota aberta, pois se eu clicar eu preciso que ele rode tudo novamente que está dentro do controller ( como se fosse a 1x ) que está acessando esse controller.

Dá uma lida na documentação de rotas, que tem um exemplo legal: https://docs.angularjs.org/api/ngRoute/service/$route

Quando editei no plunker usei o método $route.reload(); para forçar o carregamento.

...
  <a href="Book/Moby" ng-click="reloadController()">Moby</a> |
...

E no controler principal:

....
$scope.reloadController = function () {
       console.log('a função abriu porque entrou no controller sobreCtrl');
       $route.reload();
     };
...

Muito bom mesmo, acredito que isso irá resolver essa minha dúvida e prévio problema, preciso no controller ( function - colocar ao lado de $scope esse $route também?

solução!

precisa sim:

...
app.controller('sobreCtrl', function($scope, $route){
...