Redirection à l'aide d'AngularJS

86

J'essaye de rediriger vers une autre route en utilisant:

$location.path("/route");

Mais pour une raison quelconque, cela ne fonctionne pas. J'ai créé un widget de saisie semi-automatique à l'aide de jQuery-UI et j'appelle une fonction à partir de la portée une fois que l'utilisateur sélectionne une option. Je l'ai débogué et il entre dans la fonction mais il n'est jamais redirigé vers l'autre route. Cela ne change l'itinéraire que lorsque j'appuie sur une touche.

Je pense que c'est un peu étrange mais je n'ai pas trouvé comment résoudre ce problème. j'ai utilisé

window.location = "#/route";

et ça marche mais je veux utiliser la path()fonction.

Quelqu'un a-t-il une idée de pourquoi cela se produit?

Tomarto
la source

Réponses:

109

Avec un exemple de code qui ne fonctionne pas, il sera facile de répondre à cette question, mais avec cette information, le mieux que je puisse penser est que vous appelez le $ location.path en dehors du condensé AngularJS.

Essayez de faire cela sur la directive scope.$apply(function() { $location.path("/route"); });

Renan Tomal Fernandes
la source
Merci beaucoup et je suis désolé de ne pas avoir publié l'exemple qui ne fonctionne pas. Mais c'était ce dont mon code avait besoin.
Tomarto
23
Une idée comment faire fonctionner cela dans la méthode .success à l'intérieur d'une requête $ http? @Tomarto
Nicholas Kreidberg
2
sur la console firefox (30 ~) déclenche une erreur indiquant que $ apply cycle est occupé
svarog
1
Comment cela fonctionne-t-il? J'obtiens l'erreur suivante: Erreur: [$ rootScope: inprog] $ s'applique déjà en cours errors.angularjs.org/1.2.15/$rootScope/inprog?p0=%24apply à angular.js: 78 ..... par conséquent, il ne fonctionne pas comme windows.location = '' ..
Vaibhav
1
@NicholasKreidberg avait la même question et ajoutait simplement $ scope. $ Apply (); juste après $ location.path ("/ route"); travaillé pour moi.
Ernesto Allely
82

N'oubliez pas d'injecter $locationdans le contrôleur.

Stepan Suvorov
la source
2
Belle prise - c'était le problème pour moi.
Jason Swett
Belle, merci d'avoir posté ceci, ce qui semblait si évident ne l'était pas.
Chuck Conway
20

En supposant que vous n'utilisez pas le routage html5, essayez $location.path("route"). Cela redirigera votre navigateur vers #/routelequel pourrait être ce que vous voulez.

dpactri
la source
15

Si vous avez besoin de rediriger hors de votre application angulaire, utilisez $window.location. C'était mon cas; j'espère que quelqu'un le trouvera utile.

Raulucco
la source
2

Vérifiez votre méthode de routage:

si votre état de routage est comme ça

 .state('app.register', {
    url: '/register',
    views: {
      'menuContent': {
        templateUrl: 'templates/register.html',
      }
    }
  }) 

alors vous devriez utiliser

$location.path("/app/register");
jfindley
la source
0

C'est difficile à dire sans connaître votre code. Ma meilleure supposition est que l' onchangeévénement ne se déclenche pas lorsque vous modifiez la valeur de votre zone de texte à partir du code JavaScript.

Il y a deux façons pour cela de fonctionner; la première consiste à appeler onchangepar vous-même et la seconde à attendre que la zone de texte perde le focus.

Vérifiez cette question ; même problème, cadre différent.

Milan Jaric
la source