我正在尝试使用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
。有没有办法避免它?有没有办法至少使用角度承诺,也许它会让事情变得更好?
我觉得这个代码可以改进,不知道在哪个方向。任何帮助将不胜感激。
答案 0 :(得分:0)
我会说(恕我直言)你应该将尽可能多的websql包装到你的服务工厂中。在您的服务中构建您返回的对象列表,并同意使用promise是一件好事。当您在角度绑定之外进行交互时,您需要执行scope.apply,但可能应该在服务中执行此操作。即使像角度中的东西一样回调,我也会敦促不要在你的角度代码中引入这个构造。它会更具可读性。
对我来说,我试图成为一名纯粹主义者,并建议将所有第三方库隐藏在您的控制器代码中,并将其保存在您的服务和指令中。通过这样做,您可以使用NG方式编写代码,并且可以更轻松地进行单元测试。您还可以在不破坏已定义合同的情况下更换新库。
有意义吗?