- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在尝试使用 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/
我正在尝试使用当前日期和时间来执行 INSERT 和 SELECT 语句,但数据没有插入到 WebSQL 中。下面是我的代码: CREATION.. myDb.transaction(function
这是我在 stackoverflow 上的第一个问题。我尝试在这里和 Google 上搜索方法: 将文件转换为blob,将其保存在WebSQL中,然后从数据库中选择它并使用window.URL.cre
我正在使用以下语句在 Chrome 中创建一个 WebSQL 表: 'CREATE TABLE IF NOT EXISTS recs(id, fname,lname,email,country,com
所以我有一个 Javascript 类来包装和管理对 WebSQL 数据库系统的访问。 可以找到该类的代码:https://jsfiddle.net/dsct89kv/ 现在测试一下我正在使用的 fu
An online tutorial显示此交易: db.transaction(function (tx) { tx.executeSql('CREATE TABLE IF NOT EXISTS
我在循环方面遇到问题。我想实现以下步骤: 从网上下载一个巨大的 JSON 文件,然后我想循环遍历所有对象,并为每个对象(产品)从网上下载图像(使用 AJAX 调用)并填充 property obj.p
我正在尝试在 Phonegap 中创建一个应用程序并使用 WebSQL 创建本地数据库。我有一张名为“星星”的表...有很多 Actor /明星...在选择一颗星星的详细信息时,我想向其他相关明星(例
似乎无法弄清楚为什么这个简单的语句不起作用 tx.executeSql("INSERT INTO history SELECT * FROM scan"); 如果表历史记录为空,则它可以正常工作,这没
检查这个例子: var db = openDatabase( 'test.db', 1, '', 2*1024*1024 ); db.transaction(function(tx) { va
你好 friend ,我面临一个奇怪的问题。我开发 PHP 桌面应用程序, 我正在使用 websql 数据库。当我将数据提交到用户表中时 数据提交成功。但是当我提交到另一个表时数据却没有 提交的表结构
我正在尝试使用 WebSQL 和 JavaScript 执行登录功能。我写了一个函数,它接受一个参数(email)。该函数应该在数据库中搜索现有电子邮件,然后它应该返回一个警告,说明该电子邮件是否存在
我正在尝试使用复合主键在 websql 中创建一个数据库,但我似乎无法弄清楚此语句有什么问题: tx.executeSql('CREATE TABLE IF NOT EXISTS groepleden
我正在使用 WebSQL 和 IndexedDB 开发一个 Web 应用程序。 IndexedDB 在支持它的浏览器中运行良好,我的 WebSQL 实现在大多数浏览器中都可以运行,但是在 Androi
你好,我有一个工厂,它提供了与数据库一起使用的函数,它看起来像这样: .factory('DBwork', function () { var db = openDatabase("...");
这个问题已经有答案了: JavaScript closure inside loops – simple practical example (45 个回答) 已关闭 7 年前。 为什么我无法在事务中
我有以下代码来选择一行。当我用 getRecords("Peter Sam"); 调用函数时显示一条记录。但是,如果我只是通过 getRecords("Peter");它说“没有结果”。 getR
我在 iOS 上有一个使用 WebSQL 数据库的 PhoneGap 应用程序。在某些地方,我读到存储容量是 5MB,而在其他地方,我读到它是 50MB,有人可以帮我解决这个问题吗?我还计划在数据库中
https://www.w3.org/TR/webdatabase/#sqlstatementerrorcallback 看到这里sql语句错误回调定义了返回类型boolean: [Callback=
我正在使用 Web SQL 数据库构建应用程序。我记得在某处看到有一种方法可以使用 Google Chrome 来检查 Web SQL 数据库, 但是我找不到这样做的正确方法。 最佳答案 您可以使用
让我澄清一下,当我说移动网络应用程序时,我指的是旨在跨不同移动平台运行的网络应用程序,而不是访问互联网获取数据的 native 移动应用程序。 所以我正在阅读一些内容,看看这些移动网络应用程序如何在客
我是一名优秀的程序员,十分优秀!