私は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;
});