AngularJs: отменить разрешение маршрута без обещания

Мне нужно отменить мой маршрут в случае неправильного входа в систему, это мой код ANGULARJS NG-ROUTE:

monApp.config(function ($routeProvider, $locationProvider){

    var rsf = { // This function tells if user is logged or not
        "check":function(stockeUtilisateur,$location,Notification){
            u = stockeUtilisateur.getUtilisateur();

                if(u.role=='admin'||u.role=='utilisateur'){
                    Notification.success("Youre logged");
                }
                else{ 
                     $location.path('/accueil');     //redirect user to home.
                    Notification.error("bad password");
                }
        }
    };

    $routeProvider
    .when('/accueil', {
      templateUrl: 'vues/accueil.html',
      controller: 'neutreCtrl'
    })
    .when('/compte', {
      templateUrl: 'vues/compte.html',
      controller: 'compteCtrl',
      resolve:rsf 
    })

    .otherwise({redirectTo: '/accueil'}); 
})

Проблема в том, что я не хочу использовать $location.path() в случае сбоя входа в систему, потому что он перезагружает всю страницу, в то время как мне просто нужно оставаться на маршруте и просто отменить маршрут, если логин пользователя неверен.

Я не знаю, какой код я мог бы использовать, я пробовал это вместо $location.path() : event.preventDefault();, но это не работает.

Я также пробовал resolve.cancel();, но это тоже не работает, snif !

Если я удалю $location.path(), разрешение по-прежнему будет работать, и я смогу видеть представление «compte», пока пользователь не вошел в систему.

Другими словами, я не хочу, чтобы меня перенаправляли, но я хотел бы просто ничего не делать в случае неправильного пароля.

Может быть, у вас есть идея?

Спасибо .


person jojo45    schedule 18.07.2017    source источник
comment
Я недостаточно уверен, чтобы опубликовать ответ, но быстрое исследование говорит о том, что для события $locationChangeStart следует использовать предотвращение по умолчанию. weblogs.asp.net/dwahlin/ stackoverflow.com/questions/16344223/   -  person Jordan.J.D    schedule 18.07.2017
comment
Я бы повторил то, что сказал @Jordan.JD, используя события маршрутизатора. Скорее всего, вам придется хранить данные для входа какое-то место временно, чтобы проверять их во время обработчика событий. Но обязательно удалите эти данные независимо от успешного/неудачного входа в систему.   -  person jusopi    schedule 18.07.2017


Ответы (1)


Проблема в том, что я не хочу использовать $location.path() в случае сбоя входа в систему, потому что он перезагружает всю страницу, в то время как мне просто нужно оставаться на маршруте и просто отменить маршрут, пока пользователь входит в систему неправильно.

Чтобы отменить изменение маршрута из функции преобразователя, используйте оператор броска:

monApp.config(function ($routeProvider, $locationProvider){

    var rsf = { // This function tells if user is logged or not
        "check":function(stockeUtilisateur,$location,Notification){
            u = stockeUtilisateur.getUtilisateur();

                if(u.role=='admin'||u.role=='utilisateur'){
                    Notification.success("Youre logged");
                }
                else{ 
                    //$location.path('/accueil'); 
                    //Notification.error("bad password");
                    throw "bad bassword";
                }
        }
    };

    $routeProvider
    .when('/accueil', {
      templateUrl: 'vues/accueil.html',
      controller: 'neutreCtrl'
    })
    .when('/compte', {
      templateUrl: 'vues/compte.html',
      controller: 'compteCtrl',
      resolve:rsf 
    })

    .otherwise({redirectTo: '/accueil'}); 
})

Когда функция разрешения выдает ошибку, изменение маршрута предотвращается и $routeChangeError событие транслируется.

person georgeawg    schedule 18.07.2017