Comment rediriger vers une autre page en utilisant AngularJS?


171

J'utilise un appel ajax pour exécuter des fonctionnalités dans un fichier de service et si la réponse est réussie, je souhaite rediriger la page vers une autre URL. Actuellement, je fais cela en utilisant de simples js "window.location = response ['message'];". Mais je dois le remplacer par du code angularjs. J'ai cherché diverses solutions sur stackoverflow, ils ont utilisé $ location. Mais je suis nouveau dans angular et j'ai du mal à le mettre en œuvre.

$http({
            url: RootURL+'app-code/common.service.php',
            method: "POST",
            headers: {'Content-Type': 'application/x-www-form-urlencoded'},
            dataType: 'json',
            data:data + '&method=signin'

        }).success(function (response) {

            console.log(response);

            if (response['code'] == '420') {

                $scope.message = response['message'];
                $scope.loginPassword = '';
            }
            else if (response['code'] != '200'){

                $scope.message = response['message'];
                $scope.loginPassword = '';
            }
            else {
                window.location = response['message'];
            }
            //  $scope.users = data.users;    // assign  $scope.persons here as promise is resolved here
        })

2
Pourquoi avez-vous besoin d'utiliser angular pour cela? Une raison spécifique? document.location est la bonne manière et probablement plus efficace que la voie angulaire
casraf

Réponses:


229

Vous pouvez utiliser Angular $window:

$window.location.href = '/index.html';

Exemple d'utilisation dans un contrôleur:

(function () {
    'use strict';

    angular
        .module('app')
        .controller('LoginCtrl', LoginCtrl);

    LoginCtrl.$inject = ['$window', 'loginSrv', 'notify'];

    function LoginCtrl($window, loginSrv, notify) {
        /* jshint validthis:true */
        var vm = this;
        vm.validateUser = function () {
             loginSrv.validateLogin(vm.username, vm.password).then(function (data) {          
                if (data.isValidUser) {    
                    $window.location.href = '/index.html';
                }
                else
                    alert('Login incorrect');
            });
        }
    }
})();

1
J'ai utilisé $ window.location.href mais cela donne une erreur de la fonction non définie $ window.location. Dois-je inclure une dépendance pour cela?
Farjad Hasan

3
Non, mais vous devrez peut-être injecter $ window dans votre contrôleur. Voir ma réponse modifiée.
Ewald Stieger

2
Son window.location.href et non $ window.location.href
Junaid

3
@ user3623224 - ce n'est pas, en fait;)
Ben

12
@Junaid window.location.href est pour l'objet window traditionnel, $ window.location.href est pour l'objet window AngularJS $, ici: docs.angularjs.org/api/ng/service/$window
Mikel Bitson

122

Vous pouvez rediriger vers une nouvelle URL de différentes manières.

  1. Vous pouvez utiliser $ window qui actualisera également la page
  2. Vous pouvez "rester à l'intérieur" de l'application d'une seule page et utiliser $ location, auquel cas vous pouvez choisir entre $location.path(YOUR_URL);ou $location.url(YOUR_URL);. Donc, la différence fondamentale entre les 2 méthodes est que cela $location.url()affecte également les paramètres d'obtention, alors que ce $location.path()n'est pas le cas.

Je recommanderais de lire les documents $locationet $windowainsi vous aurez une meilleure compréhension des différences entre eux.


15

$location.path('/configuration/streaming'); cela fonctionnera ... injectez le service de localisation dans le contrôleur


13

J'ai utilisé le code ci-dessous pour rediriger vers une nouvelle page

$window.location.href = '/foldername/page.html';

et injecté l'objet $ window dans ma fonction de contrôleur.


12

Cela pourrait vous aider !!

L'échantillon de code AngularJs

var app = angular.module('app', ['ui.router']);

app.config(function($stateProvider, $urlRouterProvider) {

  // For any unmatched url, send to /index
  $urlRouterProvider.otherwise("/login");

  $stateProvider
    .state('login', {
      url: "/login",
      templateUrl: "login.html",
      controller: "LoginCheckController"
    })
    .state('SuccessPage', {
      url: "/SuccessPage",
      templateUrl: "SuccessPage.html",
      //controller: "LoginCheckController"
    });
});

app.controller('LoginCheckController', ['$scope', '$location', LoginCheckController]);

function LoginCheckController($scope, $location) {

  $scope.users = [{
    UserName: 'chandra',
    Password: 'hello'
  }, {
    UserName: 'Harish',
    Password: 'hi'
  }, {
    UserName: 'Chinthu',
    Password: 'hi'
  }];

  $scope.LoginCheck = function() {
    $location.path("SuccessPage");
  };

  $scope.go = function(path) {
    $location.path("/SuccessPage");
  };
}

6

Dans AngularJS, vous pouvez rediriger votre formulaire (lors de la soumission) vers une autre page en utilisant window.location.href='';comme ci-dessous:

postData(email){
    if (email=='undefined') {
      this.Utils.showToast('Invalid Email');
    } else {
      var origin = 'Dubai';
      this.download.postEmail(email, origin).then(data => { 
           ...
      });
      window.location.href = "https://www.thesoftdesign.com/";      
    }
  }

Essayez simplement ceci:

window.location.href = "https://www.thesoftdesign.com/"; 

4

J'ai également rencontré des problèmes de redirection vers une page différente dans une application angulaire

Vous pouvez ajouter le $windowcomme Ewald l'a suggéré dans sa réponse, ou si vous ne voulez pas ajouter le $window, ajoutez simplement un délai d'attente et cela fonctionnera!

setTimeout(function () {
        window.location.href = "http://whereeveryouwant.com";
    }, 500);

2

La façon simple que j'utilise est

app.controller("Back2Square1Controller", function($scope, $location) {
    window.location.assign(basePath + "/index.html");
});

2

Un bon moyen de le faire est d'utiliser $ state.go ('statename', {params ...}) est plus rapide et plus convivial pour l'expérience utilisateur dans les cas où vous n'avez pas à recharger et à démarrer toute la configuration de l'application, etc.

(function() {
    'use strict';

    angular
        .module('app.appcode')
        .controller('YourController', YourController);

    YourController.$inject = ['rootURL', '$scope', '$state', '$http'];

    function YourController(rootURL, $scope, $state, $http) {

        $http({
                url: rootURL + 'app-code/common.service.php',
                method: "POST",
                headers: {'Content-Type': 'application/x-www-form-urlencoded'},
                dataType: 'json',
                data:data + '&method=signin'

            }).success(function (response) {
                if (response['code'] == '420') {

                    $scope.message = response['message'];
                    $scope.loginPassword = '';
                } else if (response['code'] != '200') {

                    $scope.message = response['message'];
                    $scope.loginPassword = '';
                } else {
                    // $state.go('home'); // select here the route that you want to redirect
                    $state.go(response['state']); // response['state'] should be a route on your app.routes
                }
            })
    }

});

// itinéraires

(function() {
    'use strict';

    angular
        .module('app')
        .config(routes);

    routes.$inject = [
        '$stateProvider',
        '$urlRouterProvider'
    ];

    function routes($stateProvider, $urlRouterProvider) {
        /**
         * Default path for any unmatched url
        */
        $urlRouterProvider.otherwise('/');

        $stateProvider
            .state('home', {
                url: '/',
                templateUrl: '/app/home/home.html',
                controller: 'Home'
            })
            .state('login', {
                url: '/login',
                templateUrl: '/app/login/login.html',
                controller: 'YourController'
            })
            // ... more routes .state
   }

})();

0
 (function () {
"use strict";
angular.module("myApp")
       .controller("LoginCtrl", LoginCtrl);

function LoginCtrl($scope, $log, loginSrv, notify) {

    $scope.validateUser = function () {
        loginSrv.validateLogin($scope.username, $scope.password)
            .then(function (data) {
                if (data.isValidUser) {
                    window.location.href = '/index.html';
                }
                else {
                    $log.error("error handler message");
                }
            })
    }
} }());

0

Si vous souhaitez utiliser un lien, alors: dans le html, avez:

<button type="button" id="btnOpenLine" class="btn btn-default btn-sm" ng-click="orderMaster.openLineItems()">Order Line Items</button>

dans le fichier dactylographié

public openLineItems() {
if (this.$stateParams.id == 0) {
    this.Flash.create('warning', "Need to save order!", 3000);
    return
}
this.$window.open('#/orderLineitems/' + this.$stateParams.id);

}

J'espère que vous voyez cet exemple utile car il a été pour moi avec les autres réponses.


0

En utilisant location.href="./index.html"

ou créer scope $window

et en utilisant $window.location.href="./index.html"

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.