2016-03-21 15 views
0

Başımı sorunumun etrafına sarayamıyordum, sonunda anladım.İyonik & SQLite - Sözler ile init yükünün yapılandırılması

ben cordova sqlite plugin içinden çalıştırıyorum bir SQLite veritabanında, kullanıcı verilerini başlatmak zorundadır. Benim problemim DB'nin okunması asenkronize edilemez ertelenebilir this.loadData fonksiyonunda (aşağıda) olmasıdır. ("Eski moda" olabilirim, ama benim büyük şikayetimiz - DB erişimi, veritabanlarının diğer tüm akıl yürütme uygulamaları gibi senkronize bir fonksiyonda olamaz. Ertelenmeden, doğrudan doğruya olur.)

Denetleyicim $stateChangeSuccess için leaflet.js haritayı görüntülediğim yere tepki veriyor, bu da hemen durum denetleyicide $urlRouterProvider.otherwise('/app/map'); tarafından başlatılıyor.

Benim sorunum ben bütün veriler yüklenene kadar görünümü denetleyicisi yükü oyalamaya nasıl bilmiyorum olmasıdır. SQLite verisini $ionicPlatform.ready'a yüklemeyi denedim, bu yüzden yük hemen tetiklenecek, ancak cihaz yükleme görünümünde arka plan SQLite iş parçacığı üstleniyor.

Ayrıca sonunda this.loadData() arayarak modülü örnekleme sırasında modül içindeki veri yüklemek için çalışılmıştır. Ancak, cordova modülü o zamana kadar başlatılamaz ve başarısız olur.

En iyi yol nedir? Her şey yüklendiğinde ateşlenebilecek özel bir etkinlik yapabilir miyim? Tüm ilerlemeyi bekleyen açılış ekranından sonra bir ara görünüm eklemem gerekir mi?

Esasen benim veri yüklenir kadar bütün uygulama yükleme prosedürü bekleme yapmak zorunda ve SQLite güçler, bir bütün veriler bir söz erişmek yapmak bu nasıl başa bilmiyorum. Gerçekten bir şekilde senkronizasyon/async DB erişimi tercih etmeyi tercih ederim. Eğer bir söz dönmek üzere

//this is in a module dataService 
this.loadData = function(){ 
     if(!myDB) 
      myDB = $cordovaSQLite.openDB('my.db'); 

     var deferred = $q.defer(); 

     myDB.transaction(function(transaction1) { 

      transaction1.executeSql('SELECT ID,Data FROM myDB;', [], 
        function(tx, result) { 
       console.log(result.rows.length); 
       var dataJSON = result.rows.item(0).Data; 
       var dataParsed = JSON.parse(dataJSON); 
       deferred.resolve(dataParsed); 
      }, 
      function(error) { 
       console.log("SELECT failed. Must create table first"); 
       //do other stuff ... 
      }); 
     }); 

     return deferred.promise; 
    } 

// in my MapViewController the app reacts to 
    $scope.$on("$stateChangeSuccess", function() { 
    // init views with the data that should be available now 
    } 
//this is in the starter module 

angular.module('starter',[]).config(function($stateProvider, $urlRouterProvider){ 
\\... states ... 
$urlRouterProvider.otherwise('/app/map'); 
} 

cevap

0

, sen then statament üzerinde çözmek zorunda ve içindeki bir yönlendirme yapabilirsiniz.

loadData 
    .then(loadDataSuccess) 
    .catch(loadDataError) 
    function loadDataSuccess(data){ 
      $state.go('map') 
    } 
    function loadDataError(error){ 
      //do stuff 
    }