Jestem na końcu mojego sprytu, nerwów, wszystkiego, przez ostatnie 4 godziny próbuję debugować i czytać w całym Internecie, jaki problem może być z tym.
Tak, pracuję nad wzornikiem aplikację mobilną i moja logika jest tak:
- Jeśli użytkownik zalogował się w przeszłości, mamy dane w localStorage o tym, a następnie pokazać mu listę . to jest offline
- Jeśli jesteśmy podłączeni do Internetu, pokaż najpierw listę i sprawdź w tle, czy nadal jest zalogowany
- Jeśli NIE JEST, przekieruj do strony logowania.
Na głównym widoku domowym oceniam powyższe stwierdzenia, najpierw pokazuję mu listing, jeśli ma on dane z LocalStorage, następnie sprawdzam online i przekierowuję do logowania, jeśli to konieczne.
Ilekroć mam dwie lokalizacje $ stan lub $ to pętle. Tak jak w przeglądarce prawie się zawiesza, na szczęście jest to Chrome. i otrzymuję numer Cannot call method 'insertBefore' of null
. Z tego, co czytam, znany jest problem routera angular.ui, jeśli jest używany źle lub jakiś inny mistyczny problem.
Niektóre Kod:
Te nadajniki i odbiorniki zdarzeń, które nazywam w zamian mojego StateManagement Services
//Notification Helpers, also exposed, to keep them in the same scope tree.
function emitNotification (event, data) {
console.log('Emitting event: ' + event);
$rootScope.$emit(event, data);
}
function emitListen (event, fn) {
console.log('Listening for: ' + event);
$rootScope.$on(event, function (e, data) {
fn(data);
});
}
. . .LOGIC
//Update the userData in localStorage and in .value
$auth.storage.set('userData', data);
userData = $auth.storage.get('userData'); //TODO: Redundant, store it directly, is it ok?
emitNotification('event:auth-okServer', data);
//return 'ok-server';
... powrót mój serwis
},
loginSuccess: function(data){
emitNotification('event:auth-loginSuccess', data);
},
loginFailed: function(data){
emitNotification('event:auth-loginFailed', data);
},
notify: emitNotification,
listen: emitListen
i to w moim kontrolera:
.config(function config($stateProvider) {
$stateProvider
.state('sidemenu.home', {
url: '/home',
views: {
'topView': {
controller: 'HomeCtrl',
templateUrl: 'home/home.tpl.html'
}
}
})
.state('sidemenu.home.list', {
url: '/list',
templateUrl: 'home/home-list.tpl.html',
controller: 'ListCtrl'
})
.state('sidemenu.home.login', {
url: '/login',
templateUrl: 'home/home-login.tpl.html',
controller: 'LoginCtrl'
})
.state('sidemenu.home.register', {
url: '/register',
templateUrl: 'home/home-register.tpl.html',
controller: 'RegisterCtrl'
})
.state('sidemenu.home.coach', {
url: '/coach',
templateUrl: 'home/home-coach.tpl.html',
controller: 'CoachCtrl'
})
;
})
.controller('HomeCtrl', function HomeController($scope, $state, $location, localState) {
/**
* EVENT EMITTERS
* @event:auth-loginSuccess - Login has been succesfull, let everybody know.
* @event:auth-loginFailed - Login has failed, do something.
* @event:auth-okServer - Server challenge ok, user is logged in.
* @event:auth-okLocal - Local challenge ok, user appears to be logged in.
* @event:auth-login - Go to login
* @event:general-coach - Start the coach
**/
/**
* ===== FIRST LOGIC =====
**/
//We are placing emitters in the same children-parent tree scope, the one from localState, and we're listening to them.
localState.listen('event:auth-okLocal', function(data) {
console.log('EVENT: auth-okLocal has been triggered');
//$state.transitionTo('sidemenu.home.list');
$location.path('/sidemenu/home/list');
//First we will be redirected on listpage
});
localState.listen('event:auth-login', function() {
console.log('EVENT: auth-login has been triggered');
$location.path('/sidemenu/home/login');
});
//Server check fails, redirect to login
localState.listen('event:general-coach', function(data) {
console.log('EVENT: general-coach has been triggered');
//$state.transitionTo('sidemenu.home.coach');
$location.path('/sidemenu/home//coach');
});
//After we have all the listeners in place do the checking & broadcasting.
localState.check();
Co robię źle?
Mam debugowane emiterów, moja funkcja check(), która tworzy wszystkie emiterów, Próbowałem kilka kombinacji na ui.router i mam marnie nie udało :).
dobrze, domyślił w którymś momencie, gdy istniała jakaś niedokończona sprawa w stanie ui.router, i dlatego próbowałem uruchomić drugą trasę, aby przejść do strony logowania 3 sekundy później, robi dokładnie to samo, szczerze mówiąc uważam, że to niefortunne połączenie. Jako IDEA, czy mogę podłączyć detektor zdarzeń, który nasłuchuje zdarzenia 'auth-login' po pomyślnym uruchomieniu' '$ stateChangeSuccess'' na stronie aukcji? –
Nie, to nadal nie jest w porządku, strona z listą będzie dostępna bardzo często. Zauważyłem, że adres URL na mojej stronie zmienia się jak szalony z listy do logowania, mam na myśli faktyczną abstrakcyjną pętlę przekierowania. Powinien istnieć sposób na zbieranie zdarzeń, kiedy dwa konkretne zdarzenia wystrzeliwują wtedy, gdy przeniesie mnie to na stronę logowania, ale ja w tym trochę mgliście.:) –
hmmmm, https://groups.google.com/forum/#!topic/angular/Ilv1uPOTxgY :) –