具有异步范围的angular js控制器,websql

时间:2014-06-19 21:33:40

标签: javascript angularjs cordova asynchronous web-sql

我正在尝试使用AngularJs构建我的第一个应用程序。我正在为Tizen OS构建它,我也使用Jquery mobile,但在这种情况下这并不重要。

作为持久存储,我选择了WebSql。 我找到了一个很好的包装器作为角度模块 - angular-websql。 我或多或少想出了简单的角度控制器是如何工作的,但所有这些WebSql的东西都是异步的,这让我的事情变得非常复杂。

我出来了一个方法,但我不确定它是否是"棱角分明的方式"。

app = angular.module('foo', ["angular-websql"])
.factory('User', function ($webSql) {
    db = $webSql.openDatabase('mydb', '1.0', 'Test DB', 2 * 1024 * 1024);
    db.createTable('users', {
       // table schema
    });

    User = {};
    User.insert = function(elem, callback) {
        db.insert('expenses', elem, callback);
    }
    User.selectAll = function(handler, callback){
        db.selectAll('expenses', function(results) {
            for(var i=0; i < results.rows.length; i++) {
             handler(results.rows.item(i));
            }
            callback();
        });
    }
    return User;
})

.controller('BarCtrl', function ($scope, User) {
    $scope.add = function () {
      User.insert({
         name: $scope.name,
         lastname: $scope.lastname
         //and so on
      }, UpdateUsers)
    }

    function UpdateUsers() {
        $scope.users = []
        Foo.selectAll(function(elem) {$scope.users.push(elem)}, $scope.$apply});
    }
 });

由于它来自代码,我必须在将记录添加到数据库后手动更新expense绑定(因为该操作是异步的)。我还必须打电话给$scope.$apply。有没有办法避免它?有没有办法至少使用角度承诺,也许它会让事情变得更好? 我觉得这个代码可以改进,不知道在哪个方向。任何帮助将不胜感激。

1 个答案:

答案 0 :(得分:0)

我会说(恕我直言)你应该将尽可能多的websql包装到你的服务工厂中。在您的服务中构建您返回的对象列表,并同意使用promise是一件好事。当您在角度绑定之外进行交互时,您需要执行scope.apply,但可能应该在服务中执行此操作。即使像角度中的东西一样回调,我也会敦促不要在你的角度代码中引入这个构造。它会更具可读性。

对我来说,我试图成为一名纯粹主义者,并建议将所有第三方库隐藏在您的控制器代码中,并将其保存在您的服务和指令中。通过这样做,您可以使用NG方式编写代码,并且可以更轻松地进行单元测试。您还可以在不破坏已定义合同的情况下更换新库。

有意义吗?