$rootScope.$(“$routeChangeSuccess) ou $rootScope.$(”$stateChangeSuccess) ne fonctionne pas lors de l'utilisation de l'interface utilisateur du routeur(AngularJS)
Je suis à l'aide de l'INTERFACE utilisateur du routeur pour vues imbriquées dans ma demande, mais en même temps je veux écouter les événements lorsque les changements de route. Avant d'utiliser l'INTERFACE utilisateur-routeur routeChangeSuccess tirait très bien, mais après ui-routeur, il ne se déclenche pas. La Documentation suggère d'utiliser des viewContedLoaded ou stateChangeSuccess pour être utilisés, mais ils ne pas se faire virer. Je suis coller mon code extrait.
Toute aide serait appréciée.
var app = angular.module('SmartKart', ['ngCookies','ngRoute','ui.bootstrap','angularPayments','ngAnimate','toaster','ui.router','LocalStorageModule']);
app.config(['$routeProvider','$httpProvider','$urlRouterProvider', '$stateProvider', function($routeProvider, $httpProvider,$urlRouterProvider,$stateProvider) {
$routeProvider
//TODO: Clean-up...most of these routes can be eliminated since we are now using nested views inside main.html. should probably use .otherwise(... main.html) or something
.when('/postal',
{
templateUrl: 'static/partials/landingPage.html',
requireLogin: false
})
.when('/register',
{
templateUrl:'static/partials/landingPage.html',
requireLogin: false
})
.when('/login',
{
templateUrl:'static/partials/landingPage.html',
requireLogin: false
})
.when('/forgot',
{
templateUrl:'static/partials/landingPage.html',
requireLogin: false
})
//TODO: Clean-up...most of these routes can be eliminated since we are now using nested views inside main.html
.when('/noregister',
{
templateUrl:'static/partials/landingPage.html',
requireLogin: false
})
.when('/contact',
{
templateUrl:'static/partials/contact.html'
})
.when('/home',
{
templateUrl:'static/partials/main.html',
requireLogin: true
})
.when('/productList', //so routeProvider will load main.html, stateProvider will load the product list nested view
{
templateUrl:'static/partials/main.html',
requireLogin: true
})
.when('/searchResults', //so routeProvider will load main.html, stateProvider will load the product list nested view
{
templateUrl:'static/partials/main.html',
requireLogin: true
})
.when('/products/:storeId',
{
templateUrl:'static/partials/main.html',
requireLogin: true
})
.when('/products/store/:storeId/department/:departmentId/aisle/:aisleId',
{
templateUrl:'static/partials/main.html',
requireLogin: true
})
//.when('/productDetail/:productId',
//{
// templateUrl:'static/partials/productDetail.html' ,
// requireLogin: true
//})
.when('/checkout',{
templateUrl:'static/partials/page.html',
requireLogin: true
})
.when('/jobrequest',{
templateUrl:'static/partials/driverJobRequest.html'
})
.when('/orders',{
templateUrl:'static/partials/page.html', //stateProvider will load the Orders list as a nested view within the main html
requireLogin: true
})
.when('/admin',{
templateUrl:'static/partials/main.html'
})
.when('/reset',{
templateUrl:'static/partials/resetPassword.html'
})
.when('/changePassword',{
templateUrl:'static/partials/changePassword.html',
requireLogin: false
})
.when('/driver/:orderNumber',{
templateUrl:'static/partials/main.html',
requireLogin: false
})
.when('/driver',{
templateUrl:'static/partials/main.html',
requireLogin: false
})
.when('/profilepage',{
templateUrl:'static/partials/profilePage.html',
requireLogin: false
})
.when('/', {
templateUrl : 'static/partials/landingPage.html',
requireLogin: false
});
$httpProvider.defaults.useXDomain = true;
delete $httpProvider.defaults.headers.common['X-Requested-With'];
$httpProvider.defaults.withCredentials = true;
//Used for controlling nested views inside main.html and page.html
$stateProvider
.state('products', {
url: "/productList",
templateUrl: "static/partials/productList.html",
controller: 'ProductListCtrl'
})
.state('searchResults', {
url: "/searchResults",
templateUrl: "static/partials/searchResults.html",
controller: 'ProductSearchResultsCtrl'
})
.state('orders', {
url: "/orders",
templateUrl: "static/partials/orderList.html",
controller: 'UserOrderListCtrl'
})
.state('checkout', {
url: "/checkout",
templateUrl: "static/partials/checkout.html",
controller: 'checkoutCtrl'
})
.state('admin', {
url: "/admin",
templateUrl: "static/partials/admin.html",
controller: 'AdminCtrl'
})
.state('driver', {
url: "/driver",
templateUrl: "static/partials/driverDashboard.html",
controller: 'DriverDashboardCtrl'
})
.state('driverOrder', { //gets assigned order for this number
url: "/driver/:orderNumber",
templateUrl: "static/partials/singleOrder.html",
controller: 'OrderCtrl',
resolve: {
order: function($stateParams) {
return $stateParams.orderNumber;
}
}
});
}]);
app.run(['$rootScope', '$location' ,'$cookieStore', '$state', 'CacheManager', function($rootScope, $location, $cookieStore, $state,CacheManager){
//(re)load cached values here
//CacheManager.loadCache();
$rootScope.$on(['stateChangeStart', function(){
alert('hello1');
var urlCheck1 = $location.path() != '/forgot' && $location.path() != '/register' && $location.path() != '/postal' && $location.path() != '/';
var urlCheck2 = $location.path() != '/jobrequest';
if(urlCheck1 && urlCheck2){
if($cookieStore.get('userToken') == undefined){
$location.path('/login');
//seems insufficient to only check if the userToken is defined to go through here. we should check that it's == XCSRF token?
} else if($cookieStore.get('userToken') != undefined && ($location.path() == '/login' || $location.path() == '/')){
$location.path('/home');
}
}
if ($rootScope.cartItems.length > 0){
showCart();
}
}]);
}]);
Je suis confus par le titre. Êtes-vous à l'écoute de '$routeChangeSuccess " ou "stateChangeSuccess'? Dans le code que vous fournissez, vous utilisez l'interface utilisateur du routeur à la charge des états, mais écouter le natif routeur événement qui ne sera jamais déclenché dans ce scénario.
J'ai essayé d'utiliser stateChangeSuccess trop. Mais il dosent l'air de fonctionner.
Aussi, assurez-vous que '$stateChangeSuccess' est en fait, appelé. Prendre en compte le fait que si il y a un problème de chargement d'un état précis, '$stateChangeError' est appelée à la place. Alors peut-être ce que l'on doit écouter '$stateChangeStart'.
J'ai essayé d'écouter stateChangeStart trop mais dosent l'air de fonctionner. 🙁
Quelqu'un sait-il une solution à ce problème, je suis vraiment coincé et besoin d'aide!!
J'ai essayé d'utiliser stateChangeSuccess trop. Mais il dosent l'air de fonctionner.
Aussi, assurez-vous que '$stateChangeSuccess' est en fait, appelé. Prendre en compte le fait que si il y a un problème de chargement d'un état précis, '$stateChangeError' est appelée à la place. Alors peut-être ce que l'on doit écouter '$stateChangeStart'.
J'ai essayé d'écouter stateChangeStart trop mais dosent l'air de fonctionner. 🙁
Quelqu'un sait-il une solution à ce problème, je suis vraiment coincé et besoin d'aide!!
OriginalL'auteur Karan Khanna | 2014-01-31
Vous devez vous connecter pour publier un commentaire.
Deux choses dans votre code paraître bizarre pour moi, ce qui pourrait potentiellement être à l'origine du problème (puis de nouveau, depuis que je suis seulement capable de voir un peu de votre code, je peux me tromper).
La façon dont vous êtes en train de faire ceci:
Il semble que ce ne devrait pas être nécessaire si vous êtes à la configuration de votre états dans la config bloc comme l'INTERFACE utilisateur du routeur exemples montrent - voir ce lien et faites défiler jusqu'à l'étape (5). (Aussi, vos deux derniers sinon-si consolidés ont la même clause dans l'instruction if, de sorte que le " $état.aller ("commande"); " ne sera jamais exécuté.)
Parce que le bloc où vous êtes à l'envoi aux utilisateurs de différents membres en fonction de l'emplacement$.path() est au-dessus de l'endroit où vous êtes à l'enregistrement de l'écoute, votre application peut-être même pas à exécuter les lignes où vous essayez d'enregistrer l'écouteur. Je voudrais essayer le déplacement jusqu'à l'auditeur d'inscription ci-dessus que les grands si/d'autre bloc. Aussi, je suis d'accord avec ce que Phil Thomas suggéré dans les commentaires, vous devriez écouter $stateChangeStart au moins jusqu'à ce que vous êtes sûr que l'auditeur est en train d'être enregistré correctement, étant donné que d'autres questions pourraient empêcher l' $stateChangeSuccess.
Modifier: Aussi, compte tenu de vos dernières modifications, votre stateChangeStart auditeur ne doit pas regarder à droite. La façon dont vous êtes l'enregistrement de l'auditeur doit être comme ceci:
Aussi, à l'intérieur de l'auditeur, ne pas utiliser de $emplacement, n'utilisez que ce dont vous êtes donnés comme arguments à l'auditeur. Par exemple regardez toState pour voir où l'utilisateur tente d'y aller. La raison pour cela est que l'intérieur de cette fonction, qui est pendant une période de transition, vous avez besoin de savoir où l'utilisateur tente d', alors que $emplacement vais vous dire où l'utilisateur ne l'est déjà.
J'ai remplacé mon code ci-dessus avec la modification du code. Veuillez jeter un oeil et de me conseiller si je fais les choses dans le droit chemin. Merci beaucoup !! 🙂
La partie inférieure de votre config bloc, à l'aide de $état.état des appels, semble bon pour moi. La partie ci-dessus que lorsque vous êtes à l'aide de $routeProvider.lorsque les appels doivent être supprimés. Puisque vous êtes à l'aide de l'INTERFACE utilisateur du Routeur, vous pouvez utiliser $stateProvider et vous n'avez pas besoin de $routeProvider à tous.
Aussi, regarde mon edit dans ma réponse ci-dessus concernant la stateChangeStart auditeur.
OriginalL'auteur Matt Metlis