2015-04-06 2 views
2

Я использую радиально-Fullstack генератор от Yeoman пакета, включая Passport.js (FB, G +, Twitter)ANGULAR является не работает, когда предотвращение события по умолчанию

я попал в проблему, где в моем главном событие $stageChangeStart при запуске приложения, выражение $location.path('/login'); ничего не делает. Несмотря на то, что он предупреждает до и после вызова выражения, что означает, что код находится там безопасно, и нет ошибок console.log.

Это произошло после того, как я добавил event.preventDefault(); до того выражения местонахождения:

.run(function ($rootScope, $location, Auth) { 
// Redirect to login if route requires auth and you're not logged in 
$rootScope.$on('$stateChangeStart', function (event, next) { 
    Auth.isLoggedInAsync(function(loggedIn) { 
    if (next.authenticate && !loggedIn) { 
     event.preventDefault(); 
     // alerts here 
     $location.path('/login'); 
     // alerts here as well 
    } 
    }); 
}); 

Причиной, побуждающей добавив, что preventDefault было попытаться решить другую проблему.

NODE_ENV=development Редирект после успешного входа в систему/дома работает отлично, хотя, когда я строю проект с Grunt и запускаю его на удаленном сервере, этот конкретный перенаправление больше не работает, хотя я вижу конкретный вызов до $location.path('/home') в моем ушифрованном коде.

Я даже поставить галочку в main.controller.js, чтобы убедиться, что он перенаправляет/дома, если проверка подлинности пользователя:

'use strict'; 

angular.module('fckyeah') 
    .controller('MainCtrl', function ($scope, $http, Auth, socket, $location) { 
    if (Auth.isLoggedIn()) { 
     $location.path('/home'); 
    } 
    }); 

После успешного входа в систему, редирект, что происходит в моей LoginCtrl:

'use strict'; 

angular.module('fckyeah') 
.controller('LoginCtrl', function ($scope, Auth, $location, $window) { 
    $scope.user = {}; 
    $scope.errors = {}; 

    $scope.login = function(form) { 
    $scope.submitted = true; 

    if(form.$valid) { 
    Auth.login({ 
     email: $scope.user.email, 
     password: $scope.user.password 
    }) 
    .then(function() { 
     // Logged in, redirect to home 
     $location.path('/home'); 
    }) 
    .catch(function(err) { 
     $scope.errors.other = err.message; 
    }); 
    } 
}; 

$scope.loginOauth = function(provider) { 
    $window.location.href = '/auth/' + provider; 
}; 
}); 

Поэтому при запуске с NODE_ENV=production происходит то, что происходит, он перенаправляет на/# _ # или что-то в этом роде, а затем на «/», «основной» маршрут, а не «домой», как ожидалось, после успешного входа в систему и только ручную попытку ходить в/домой - работает.

Я пытаюсь понять, почему у меня есть разница в поведении между средами и почему preventDefault полностью прекращает работу ngRouter. Опасно полагаться на среду разработки, где она не может обеспечить такую ​​же функциональность при производстве.

Оцените любые советы по этому делу.

+0

Насколько я заметил, иногда вам нужно обернуть эти изменения местоположения через setTimeout или $ timeout с помощью ui-router. также похоже, что вы смешиваете концепцию ui-router и ngRouter, они разные. – YOU

ответ

0

На первом, как вы используете ui-router

вместо $location.path('/login');, вы должны использовать

$state.go("statename") 

Как это очень специфичны для производственной среды, Мое предположение, что зависимости не вводили правильно. Поэтому, когда вы очищаете свой код, убедитесь, что вы используете нотацию массива для привязки функции к контроллеру.

.controller('LoginCtrl', function ($scope, Auth, $location, $window) { 

должен быть как

.controller('LoginCtrl', ["$scope", "Auth", "$location", "$window", function ($scope, Auth, $location, $window) { 
// your code here 
}]); 

Это, чтобы убедиться, что все зависимости впрыскивают правильно.

+0

Должен ли я вводить '' $ state'' перед его использованием или он доступен по всему миру, когда включается '' ui.router'' в объявлении модуля? – deb0rian

+0

Да, вам нужно ввести '$ state' ваш метод' run' – mohamedrias

+0

Сделал это, изменил все '' $ location'' на '' $ state'', такую ​​же проблему, но с введением в '' $ state'' , Теперь у меня нет URL-адреса, он показывает мое «домашнее» состояние по URL-адресу. Есть ли код или что-то, что имеет Angular-Fullstack, поэтому я могу представить проблему? – deb0rian