gpt4 book ai didi

javascript - 具有异步作用域的 Angular JS Controller ,WebSQL

转载 作者:行者123 更新时间:2023-11-28 08:10:10 25 4
gpt4 key购买 nike

我正在尝试使用 AngularJs 构建我的第一个应用程序。我正在为 Tizen 操作系统构建它,并且我还使用 Jquery mobile,但这在本例中并不重要。

作为持久存储,我选择了WebSql。我发现了一个很好的包装器作为 Angular 模块 - angular-websql 。我或多或少地弄清楚了简单的 Angular Controller 是如何工作的,但是所有这些 WebSql 东西都是异步的,这让事情对我来说真的很复杂。

我想出了一种方法,但我不确定它是否是“Angular 方式”。

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 绑定(bind)(因为该操作是异步的)。然后我还必须调用 $scope.$apply 。有办法避免吗?有没有办法至少使用 Angular promise ,也许它会让事情变得更好?我觉得这段代码可以改进,但不确定朝哪个方向改进。任何帮助将不胜感激。

最佳答案

我想说(恕我直言)你应该将尽可能多的 websql 包装到你的服务工厂中。在您的服务中构建返回的对象列表,并同意使用 promise 将是一件好事。当您在 Angular 绑定(bind)之外进行交互时,您确实需要执行scope.apply,但可能应该在服务中执行此操作。尽管 Angular 中有回调之类的东西,但我强烈建议不要在 Angular 代码中引入此构造。它将更具可读性。

对我来说,我尝试成为一个纯粹主义者,并建议从 Controller 代码中隐藏所有第三方库,并将其保留在您的服务和指令中。通过这样做,您可以以 NG 方式编写代码,并且可以使单元测试变得更加容易。您还可以在不违反已定义契约(Contract)的情况下更换新库。

有道理吗?

关于javascript - 具有异步作用域的 Angular JS Controller ,WebSQL,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24316591/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com