Angularjs 基于sqllite的离子框架

Angularjs 基于sqllite的离子框架,angularjs,ionic-framework,ionic,Angularjs,Ionic Framework,Ionic,我使用的是离子框架 我正在执行以下步骤 1) 当我的应用程序运行时。它将创建数据库和表 2) 一旦使用登录,我就将数据保存到mysql并转到仪表板页面 dbQuery.insertCategory(); $state.go('app.dashboard'); dbQuery是一个工厂 .factory('dbQuery', function ($http, $q, $cordovaSQLite, localstorage) { return { insertCat

我使用的是离子框架

我正在执行以下步骤

1) 当我的应用程序运行时。它将创建数据库和表 2) 一旦使用登录,我就将数据保存到mysql并转到仪表板页面

dbQuery.insertCategory();
 $state.go('app.dashboard');
dbQuery是一个工厂

.factory('dbQuery', function ($http, $q, $cordovaSQLite, localstorage) {
     return {
         insertCategory: function () {
             $http({
                 url: "http://mydoman.comcategory",
                 method: 'GET',
                 withCredentials: true,
             }).success((function (result) {
                 var user_id = localstorage.get('user_id');
                 var query = "INSERT OR IGNORE INTO categories (category_id, user_id, category_name,category_type) VALUES (?,?,?,?)";
                 var data = '';
                 result.forEach(function (category) {
                     $cordovaSQLite.execute(db, query, [category.id,user_id, category.category_name, category.category_type]).then(function (res) {
                         console.log("insertId");
                     }, function (err) {

                         console.dir(err);
                     });
                 });
            }))
         },
哪个工作正常

在仪表板上,我显示了类别列表,但什么也没找到

我进行了调试,发现插入类别需要时间

有没有办法进行双向数据绑定


谢谢

为什么不使用承诺,并在成功承诺触发后只重定向到
app.dashboard

例如:

dbQuery.insertCategory().then(function(result) {
    $state.go('app.dashboard');
}, function(error) {
    console.error(error);
});
然后在你的工厂里,你可以有这样的东西:

.factory('dbQuery', function ($http, $q, $cordovaSQLite, localstorage) {
     return {
         insertCategory: function () {
             var deferred = $q.defer();
             $http({
                 url: "http://mydoman.comcategory",
                 method: 'GET',
                 withCredentials: true,
             }).success((function (result) {
                 var user_id = localstorage.get('user_id');
                 var query = "INSERT OR IGNORE INTO categories (category_id, user_id, category_name,category_type) VALUES (?,?,?,?)";
                 var data = '';
                 result.forEach(function (category) {
                     isWaiting = true;
                     $cordovaSQLite.execute(db, query, [category.id,user_id, category.category_name, category.category_type]).then(function (res) {
                         console.log("insertId");
                         isWaiting = false;
                     }, function (err) {
                         console.dir(err);
                         isWaiting = false;
                     });
                     while(isWaiting) {}
                 });
                 deferred.resolve("done");
            }))
            return deferred.promise;
         },
我所做的很多只是理论,但它应该给你一个想法。我创建了一个布尔值以使SQL命令同步。由于它们是同步的,当循环结束时,您可以返回您的成功承诺

也许还有其他一些方法可以让你做到这一点。比如,将SQL内容移动到它自己的函数中,然后递归地输入它


让我知道这些方法是否对您有效。

效果很好,但请您解释一下为什么使用isWaiting=false;(isWaiting){}时这又有什么作用?
$cordovaSQLite.execute
是异步的,因此通过循环,您将有x个异步调用,并立即从
insertCategory
返回,即使它们没有完成。通过添加该循环,在当前SQLite函数完成之前,它不会移动到下一个for循环迭代。至少在理论上它会这样做,因为我没有测试它。当我们确定所有SQLite调用/for循环迭代都已完成时,就要解决这个问题,因为我们确信我们已经完成了。有道理?