indexedDB bootstrap angularjs之 MVC DOMO (应用示例)
1、indexedDB(Model)--前端浏览器对象型数据库,一般我们后台用的数据库都是关系型数据库。那么indexeddb有什么特点呢:
首先,从字义上它是索引型数据库,从实际使用中可以体现为,它需要为表创建索引才可以根据某个字段来获取数据,而在关系型数据库中,这明显是不需要的。
其次,我不需要行列数据的转化,我只需要通过类似于数组的处理方式:
objectStore.push(data);
有点像是把一个json对象塞入数据库,是不是很暴力?
2、bootstrap(View)--bootstrap,老实说,我不是很熟悉这个东西,毕竟我是后端java开发出身。以我的理解,这就是一个以响应式布局为特点的前端框架,至于说比较特别的,应该就是它比较流行吧?!老实说,我这边只用到css,而我也认为,后现代的前端开发,将不会需要bootstrap的js部分,毕竟那还是以jquery为主的方式。
3、angularjs(Controller)--必须承认这个东西东西的诞生完全颠覆了我对前端开发的看法,以前和现在我们依然困在前后端无法彻底分离的窘境中,但我认为如果后期,前端人员普遍采用应用式的angularjs脚本来开发(还有一些类似的框架),我们将不再需要让后端开发工程师套用诸多的前端样式、结构等等。
这么说,很多后端人员可能还是不能体会得到,举个例子:angularjs的使用方式有点像是jsp、freemarker等渲染html的东西,只是一个在客户端渲染,另一个在后台服务器渲染。我们只要改变数据的结构和属性,对应渲染出来的页面就会不同,angularjs就是让我们更加关注数据的变化,而非DOM的变化,就是说:你将很少会去写到$("btnSave").click(function(){});这样需要获取到html节点的脚本代码,可以说,这完全脱离了jQuery的范畴。所以这可以算是一个跨时代的改变?
接下来就上例子吧(最终必须运行到服务器上):
user.html
<!DOCTYPEhtml>
<html>
<head>
<metacharset="utf-8">
<metaname="viewport"content="width=device-width"/>
<!--新Bootstrap核心CSS文件-->
<linkrel="stylesheet"href="//cdn.bootcss.com/bootstrap/3.3.5/css/bootstrap.min.css">
<scriptsrc="http://apps.bdimg.com/libs/angular.js/1.4.6/angular.min.js"></script>
</head>
<bodyng-app="myApp"ng-controller="userCtrl">
<divclass="container">
<h3>Users</h3>
<tableclass="tabletable-striped">
<thead>
<tr>
<th>Edit</th>
<th>FirstName</th>
<th>LastName</th>
</tr>
</thead>
<tbody>
<trng-repeat="oneinusers">
<td>
<buttonclass="btn"ng-click="editUser(one)">
<spanclass="glyphiconglyphicon-pencil"></span> Edit
</button>
<buttonclass="btn"ng-click="deleteUser(one.id)">
<spanclass="glyphiconglyphicon-remove"></span> Delete
</button>
</td>
<td>{{one.fName}}</td>
<td>{{one.lName}}</td>
<td>{{one.telephone}}</td>
</tr>
</tbody>
</table>
<hr>
<buttonclass="btnbtn-success"ng-click="editUser()">
<spanclass="glyphiconglyphicon-user"></span>CreateNewUser
</button>
<hr>
<h3ng-show="edit">CreateNewUser:</h3>
<h3ng-hide="edit">EditUser:</h3>
<formclass="form-horizontal">
<divclass="form-group">
<labelclass="col-sm-2control-label">FirstName:</label>
<divclass="col-sm-10">
<inputtype="text"ng-model="user.fName"ng-disabled="!edit"placeholder="FirstName">
</div>
</div>
<divclass="form-group">
<labelclass="col-sm-2control-label">LastName:</label>
<divclass="col-sm-10">
<inputtype="text"ng-model="user.lName"ng-disabled="!edit"placeholder="LastName">
</div>
</div>
<divclass="form-group">
<labelclass="col-sm-2control-label">telephone:</label>
<divclass="col-sm-10">
<inputtype="tel"ng-model="user.telephone"placeholder="telephone">
</div>
</div>
</form>
<hr>
<buttonclass="btnbtn-success"ng-click="saveCustomer()">
<spanclass="glyphiconglyphicon-save"></span>SaveChanges
</button>
</div>
<scriptsrc="jdbc.js?v=2323"></script>
<scriptsrc="myUsers.js"></script>
</body>
</html>
jdbc.js(作为一个数据访问的模块,可供各个应用加载调用)
'usestrict';
!(function(w,angular){
angular.module('db',[]).service('jdbc',function($http,$q){
var_self=this;
varmyDB={
name:'roma',
version:1,
db:null,
schema:{
2:function(db){
//初始化用户
varcustomer=db.createObjectStore('customer',{keyPath:"id",autoIncrement:true});
customer.createIndex("customer_fName_index","fName",{unique:true});
}
}
};
//用于处理跟回调函数相反的方式,当defer调用resolve方法之后,就会触发defer.promise.then(callback)传入的callback方法,并且resolve可以传入任意的变量
/**
*
*functiontest(){
*vardefer=$q.defer();
*setTimeout(2000,function(){
*defer.resolve("hello");
*});
*returndefer.promise;
*}
*
*test().then(function(say){
*console.log(say);
*});
*
*2秒之后将会打印出"hello"
*
*@type{Deferred|*}
*/
vardefer=$q.defer();
_self.onload=function(cb){
returndefer.promise.then(cb);
};
vargetDb=function(db){
vard=$q.defer();
if(db){
d.resolve(db);
}
//打开数据库
varresult=window.indexedDB.open(myDB.name);
result.onerror=function(e){
console.log("OpenDBError!");
d.reject("error");
};
//正确打开
result.onsuccess=function(e){
vardb=e.target.result;
myDB.db=db;
d.resolve(db);
};
returnd.promise;
};
_self.openDB=function(name,version,success,upgrade){
vard=$q.defer();
varname=name||myDB.name;
varversion=version||myDB.version;
//打开数据库
varresult=window.indexedDB.open(name,version);
//错误
result.onerror=function(e){
console.log("OpenDBError!");
d.reject(e);
};
//正确打开
result.onsuccess=function(e){
myDB.db=e.target.result;
if(success)success(myDB.db);
d.resolve(e);
};
//数据库版本变更
result.onupgradeneeded=function(e){
myDB.db=e.target.result;
if(upgrade)upgrade(myDB.db);
d.resolve("upgradeneeded");
};
returnd.promise;
};
varschema=function(schema){
angular.forEach(schema,function(upgrade,version,o){
_self.openDB(myDB.name,version,function(){
defer.resolve();
},function(db){
upgrade(db);
});
})
};
schema(myDB.schema);
_self.get=function(storeName,key){
vard=$q.defer();//promise
getDb(myDB.db).then(function(db){
vartransaction=db.transaction(storeName,'readonly');
varstore=transaction.objectStore(storeName);
varresult=store.get(key);
result.onsuccess=function(e){
_self.result=e.target.result;
d.resolve();
};
result.onerror=function(e){
d.reject();
};
});
returnd.promise;
};
_self.find=function(storeName,key,value){
vard=$q.defer();//promise
getDb(myDB.db).then(function(db){
vartransaction=db.transaction(storeName,'readonly');
varstore=transaction.objectStore(storeName);
varkeyRange=IDBKeyRange.only(value);
varresult=store.index(key).openCursor(keyRange,"next");
varresults=[];
result.onsuccess=function(event){
varcursor=event.target.result;
if(cursor){
results.push(cursor.value);
cursor.continue();
}else{
d.resolve(results);
}
};
result.onerror=function(e){
d.reject();
};
});
returnd.promise;
};
_self.put=function(storeName,value){
vard=$q.defer();
vardb=myDB.db||getDb();
vartransaction=db.transaction(storeName,'readwrite');
varstore=transaction.objectStore(storeName);
if(value!==null&&value!==undefined){
store.put(value);
d.resolve();
}else{
d.reject();
}
returnd.promise;
};
_self.remove=function(storeName,value){
vard=$q.defer();//promise
vardb=myDB.db||getDb();
vartransaction=db.transaction(storeName,'readwrite');
varstore=transaction.objectStore(storeName);
varresult=store.delete(value);
result.onsuccess=function(e){
d.resolve();
};
result.onerror=function(e){
d.reject();
};
returnd.promise;
};
_self.findAll=function(storeName){
vard=$q.defer();//promise
getDb(myDB.db).then(function(db){
vartransaction=db.transaction(storeName,'readonly');
varstore=transaction.objectStore(storeName);
varresult=store.openCursor();
varresults=[];
result.onsuccess=function(event){
varcursor=event.target.result;
if(cursor){
results.push(cursor.value);
cursor.continue();
}else{
d.resolve(results);
}
};
result.onerror=function(e){
d.reject();
};
});
returnd.promise;
};
return_self;
});
}(window,window.angular));
myUsers.js(应用的controller层脚本)
'usestrict';
angular.module('myApp',['db']).controller("userCtrl",function($scope,$http,jdbc){
//刷新数据结构,angularjs的双向绑定会自动帮我们渲染界面
functionreload(){
jdbc.findAll("customer").then(function(response){
if(!response){
$http.get("data.json").success(function(response){
$scope.users=response;
});
return;
}
$scope.users=response;
});
}
//数据结构完成之后刷新界面
jdbc.onload(reload);
$scope.edit=true;
var_user=$scope.user={};
$scope.editUser=function(user){
if(user){
_user.id=user.id;
_user.fName=user.fName;
_user.lName=user.lName;
_user.telephone=user.telephone;
}else{
_user.fName="";
_user.lName="";
_user.telephone="";
_user.id="";
}
};
$scope.deleteUser=function(id){
//从数据库删除记录之后刷新表格数据
jdbc.remove("customer",id).then(reload);
};
$scope.saveCustomer=function(){
//从数据库添加或更新记录之后刷新表格数据
jdbc.put("customer",_user).then(reload);
};
jdbc.find("customer","customer_fName_index","林").then(function(data){
console.log(data);
});
});
data.json(当indexedDB无法正常获取的时候用来显示数据用)
[
{
"id":1,
"fName":"林",
"lName":"嘉斌",
"telephone":"13514087953"
},
{
"id":2,
"fName":"陈",
"lName":"晓",
"telephone":"13509890786"
}
]
以上所述是小编给大家带来的indexedDBbootstrapangularjs之MVCDOMO(应用示例)的全部叙述,希望对大家有所帮助!