0

I'm looking for solution for load data from sqlite in cordova bootstrap, for more specifically in $ionicPlatform.ready but until here I don't have a solution. See a piece of my code (I'm using ionic with $cordovaSQLite):

app.js file

...
app.run(function($DB, $log, params...){
    $ionicPlatform.ready(function() {
        ...
        $DB.init().then(function(res){ 
            // here I need load a user
            $rootScope.user = res;
            $log.debug('1 step = user loaded');
        });

        $rootScope.$on('$stateChangeStart', function(event, toState, toParams){
            $log.debug('2 step = use user loaded!');
            var _requireAuth = toState.data.requireAuth;
            if(_requireAuth && !$rootScope.user){
                event.preventDefault();
                $state.go('login');
            }
        });

    });
...

DB.js file

app.factory('$DB', function($q, $cordovaSQLite, params...){
    ...
    _self.init = function(){      

        var deferred = $q.defer();

        $cordovaSQLite.execute($ndDB.open(), "SELECT * FROM user LIMIT 1", [])
                .then(function(res){
                    if(res.rows.length > 0){
                        var _user = {
                            id: res.rows.item(0).id,
                            name: res.rows.item(0).name,
                            ...
                        };
                        deferred.resolve(_user);
                    }
                }, function(err){
                    deferred.reject(err);
                });
        return deferred.promise;
        ...
    };
    ...
});

config.js file

app.config(function($urlRouterProvider, params...){
    ...
    $urlRouterProvider.otherwise('/home');
    ...
});

The problem is, I need $rootScope.user before all, because I need authenticate and redirect, but always I go direct to home, because $rootScope.user is already late and $stateChangeStart no apply redir. If put it in $DB.init() callback, the behaviour is the same because default route is /home and stateChangeStart load after Db.init().

Now I'm using a bad method, in home I check $rootScope.user and redirect to /login, but it's so bad because first we see the transition between home and login.

If I use the localStorage, it works fine, but I really need to use the sqlite.

What the best approach for this? Thanks

dsouza
  • 101
  • 1
  • 2
  • Hi again, I found this topic http://stackoverflow.com/questions/20094273/stop-angular-ui-router-navigation-until-promise-is-resolved, and I'll check it. – dsouza Jan 21 '16 at 13:47
  • Resolved, The solution is stop all in $stateChangeStart and check for user in $rootScope, if okay, continue or get from database and add in rootScope and continue. If no exists in database, redirect to login. I'm not confortable with messages in console because stop transition, but is working fine. Thanks. – dsouza Jan 24 '16 at 15:01

0 Answers0