2016-11-15 10 views
0

У меня есть приложение для платформы Crossova Cross Platform, разработанное с помощью AngularJS, которое реализует базу данных SQLite. Идея состоит в том, что пользователи могут войти в систему, и их данные будут храниться в базе данных SQLite для доступа к автономному (например, функция «Запомнить меня»).

На экране входа в систему я запускаю запрос, чтобы проверить, есть ли значения в таблице SQLite сразу после запуска приложения. Затем, в зависимости от того, есть ли значения в таблице, я показываю экран подтверждения входа ИЛИ просим пользователей ввести свои данные.

База данных работает по назначению, и я могу сохранять и читать данные в/из нее. Однако, поскольку база данных обрабатывает вызовы асинхронно, мне не удается отобразить правильный пользовательский интерфейс для пользователя.

В моем представлении логинов У меня есть переменная для хранения логического значения, содержит ли таблица SQLite значения. Однако переменная всегда empty/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 Service

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

обновление Try, как показано ниже (Это не тестировался).

В вашей службе

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