2016-11-15 5 views
0

私はSQLiteデータベースを実装するAngularJSで開発されたCordovaクロスプラットフォームアプリケーションを使用しています。ユーザーはサインインでき、その詳細はSQLiteデータベースに保存され、オフラインでアクセスできるというアイデアです(たとえば、Remember Me機能など)。

ログイン画面で、私はアプリケーションが起動するとすぐにSQLiteテーブルに値があるかどうかを確認するためにクエリを実行します。次に、テーブルに値があるかどうかによって、ログイン確認画面またはにユーザーに詳細を入力するように指示します。

データベースは意図したとおりに動作しており、詳細を保存してから読み込むことができます。しかし、データベースがコールを非同期に処理するため、正しいUIをユーザーに表示するのに問題があります。

私のログインビューでは、SQLiteテーブルに値が含まれているかどうかをブール値で保持する変数があります。ただし、変数が初期化された後に非同期呼び出しが応答するため、変数は常に空/ NULLです。

非同期呼び出しが完了したら変数を初期化するために$ qを実装しようとしていますが、実装に問題があります。次のように

私のビューコントローラはなります

コントローラ

var login = angular.module("loginController", []); 
login.controller("LoginController", function ($scope, $q, QueryRememberMe) { 
    // Check if user logged in 
    var logged = QueryRememberMe.query(); 
    logged.then(function (greeting) { 
     alert("Success: " + greeting); 
    }, function(reason) { 
     alert("Failed: " + reason); 
    }); 
    }; 
}); 

QueryRememberMeサービス

var queryRememberMe = angular.module("queryRememberMe", []); 
queryRememberMe.service("QueryRememberMe", function ($q, Database) { 

    var db = Database.init(); 
    var tableName = "tb_UD_remember_me"; 
    var userLoggedIn = ""; 

    var myFunctions = { 
     query: function() { 
      return $q(function (resolve, reject) { 
       var sql = 'SELECT * FROM ' + tableName; 
       db.transaction(function (tx) { tx.executeSql(sql, [], myFunctions.success, myFunctions.error); }); 

       if (myFunctions.success) { 
        resolve('Hello, success!'); 
       } 
       else { 
        reject('Greeting ERROR - is not allowed.'); 
       } 
      }); 
     }, 

     // Query success callback 
     success: function (tx, results, tableName) { 
      // There are no values in the table 
      if (results.rows.length == 0) { 
       userLoggedIn = false; 
      } 
      else { 
       userLoggedIn = true; 
      } 
      return userLoggedIn; 
     }, 

     // Query Error Callback 
     error: function (tx, err) { 
      alert("An error has occured - Unable to query SQL Table " + tableName); 
     }, 
    } 
    return myFunctions; 
}); 

答えて

1

以下のようにしてみアップデート(それはなしテストされます)。お使いのコントローラであなたのサービス

var myFunctions = { 
    query: function() { 
     var deferred = $q.defer(); 
     var sql = 'SELECT * FROM ' + tableName; 
     var success = function(tx, results, tableName) { 
      if (results.rows.length == 0) { 
       deferred.resolve({userLoggedIn: false}); 
      } 
      else { 
       deferred.resolve({userLoggedIn: true, message: 'Hello, success!'}); 
      } 
     } 
     var error = function(tx, err) { 
      deferred.reject({userLoggedIn: false, message: 'An error has occured - Unable to query SQL Table'}); 
     } 

     db.transaction(function (tx) { 
      tx.executeSql(sql, [], success, error); 
     }); 
     return deferred.promise; 
    } 
}; 

var logged = QueryRememberMe.query(); 
logged.then(
    function (greeting) { 
     alert("Success: " + greeting.message); 
    }, 
    function(reason) { 
     alert(reason.message); 
    } 
); 
関連する問題