indexedDB bootstrap angularjs之 MVC DOMO (應(yīng)用示例)
1、indexedDB(Model) -- 前端瀏覽器對(duì)象型數(shù)據(jù)庫(kù),一般我們后臺(tái)用的數(shù)據(jù)庫(kù)都是關(guān)系型數(shù)據(jù)庫(kù)。那么indexeddb有什么特點(diǎn)呢:
首先,從字義上它是索引型數(shù)據(jù)庫(kù),從實(shí)際使用中可以體現(xiàn)為,它需要為表創(chuàng)建索引才可以根據(jù)某個(gè)字段來(lái)獲取數(shù)據(jù),而在關(guān)系型數(shù)據(jù)庫(kù)中,這明顯是不需要的。
其次,我不需要行列數(shù)據(jù)的轉(zhuǎn)化,我只需要通過(guò)類(lèi)似于數(shù)組的處理方式:
objectStore.push(data);
有點(diǎn)像是把一個(gè)json對(duì)象塞入數(shù)據(jù)庫(kù),是不是很暴力?
2、bootstrap(View) -- bootstrap,老實(shí)說(shuō),我不是很熟悉這個(gè)東西,畢竟我是后端java開(kāi)發(fā)出身。以我的理解,這就是一個(gè)以響應(yīng)式布局為特點(diǎn)的前端框架,至于說(shuō)比較特別的,應(yīng)該就是它比較流行吧?!老實(shí)說(shuō),我這邊只用到css,而我也認(rèn)為,后現(xiàn)代的前端開(kāi)發(fā),將不會(huì)需要bootstrap的js部分,畢竟那還是以jquery為主的方式。
3、angularjs(Controller) -- 必須承認(rèn)這個(gè)東西東西的誕生完全顛覆了我對(duì)前端開(kāi)發(fā)的看法,以前和現(xiàn)在我們依然困在前后端無(wú)法徹底分離的窘境中,但我認(rèn)為如果后期,前端人員普遍采用應(yīng)用式的angularjs腳本來(lái)開(kāi)發(fā)(還有一些類(lèi)似的框架),我們將不再需要讓后端開(kāi)發(fā)工程師套用諸多的前端樣式、結(jié)構(gòu)等等。
這么說(shuō),很多后端人員可能還是不能體會(huì)得到,舉個(gè)例子:angularjs的使用方式有點(diǎn)像是jsp、freemarker等渲染html的東西,只是一個(gè)在客戶(hù)端渲染,另一個(gè)在后臺(tái)服務(wù)器渲染。我們只要改變數(shù)據(jù)的結(jié)構(gòu)和屬性,對(duì)應(yīng)渲染出來(lái)的頁(yè)面就會(huì)不同,angularjs就是讓我們更加關(guān)注數(shù)據(jù)的變化,而非DOM的變化,就是說(shuō):你將很少會(huì)去寫(xiě)到$("btnSave").click(function() {});這樣需要獲取到html節(jié)點(diǎn)的腳本代碼,可以說(shuō),這完全脫離了jQuery的范疇。所以這可以算是一個(gè)跨時(shí)代的改變?
接下來(lái)就上例子吧(最終必須運(yùn)行到服務(wù)器上):
user.html
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <meta name="viewport" content="width=device-width"/> <!-- 新 Bootstrap 核心 CSS 文件 --> <link rel="stylesheet" > <script src="http://apps.bdimg.com/libs/angular.js/1.4.6/angular.min.js"></script> </head> <body ng-app="myApp" ng-controller="userCtrl"> <div class="container"> <h3>Users</h3> <table class="table table-striped"> <thead> <tr> <th>Edit</th> <th>First Name</th> <th>Last Name</th> </tr> </thead> <tbody> <tr ng-repeat="one in users"> <td> <button class="btn" ng-click="editUser(one)"> <span class="glyphicon glyphicon-pencil"></span> Edit </button> <button class="btn" ng-click="deleteUser(one.id)"> <span class="glyphicon glyphicon-remove"></span> Delete </button> </td> <td>{{ one.fName }}</td> <td>{{ one.lName }}</td> <td>{{ one.telephone }}</td> </tr> </tbody> </table> <hr> <button class="btn btn-success" ng-click="editUser()"> <span class="glyphicon glyphicon-user"></span> Create New User </button> <hr> <h3 ng-show="edit">Create New User:</h3> <h3 ng-hide="edit">Edit User:</h3> <form class="form-horizontal"> <div class="form-group"> <label class="col-sm-2 control-label">First Name:</label> <div class="col-sm-10"> <input type="text" ng-model="user.fName" ng-disabled="!edit" placeholder="First Name"> </div> </div> <div class="form-group"> <label class="col-sm-2 control-label">Last Name:</label> <div class="col-sm-10"> <input type="text" ng-model="user.lName" ng-disabled="!edit" placeholder="Last Name"> </div> </div> <div class="form-group"> <label class="col-sm-2 control-label">telephone:</label> <div class="col-sm-10"> <input type="tel" ng-model="user.telephone" placeholder="telephone"> </div> </div> </form> <hr> <button class="btn btn-success" ng-click="saveCustomer()"> <span class="glyphicon glyphicon-save"></span> Save Changes </button> </div> <script src="jdbc.js?v=2323"></script> <script src="myUsers.js"></script> </body> </html>
jdbc.js(作為一個(gè)數(shù)據(jù)訪問(wèn)的模塊,可供各個(gè)應(yīng)用加載調(diào)用)
'use strict'; !(function (w, angular) { angular.module('db', []).service('jdbc', function ($http, $q) { var _self = this; var myDB = { name: 'roma', version: 1, db: null, schema: { 2: function(db) { // 初始化 用戶(hù) var customer = db.createObjectStore('customer', {keyPath:"id", autoIncrement: true}); customer.createIndex("customer_fName_index", "fName", {unique: true}); } } }; // 用于處理跟回調(diào)函數(shù)相反的方式,當(dāng)defer調(diào)用resolve方法之后,就會(huì)觸發(fā)defer.promise.then(callback)傳入的callback方法,并且resolve可以傳入任意的變量 /** * * function test() { * var defer = $q.defer(); * setTimeout(2000, function() { * defer.resolve("hello"); * }); * return defer.promise; * } * * test().then(function(say) { * console.log(say); * }); * * 2秒之后將會(huì)打印出"hello" * * @type {Deferred|*} */ var defer = $q.defer(); _self.onload = function(cb) { return defer.promise.then(cb); }; var getDb = function(db) { var d = $q.defer(); if (db) { d.resolve(db); } // 打開(kāi)數(shù)據(jù)庫(kù) var result = window.indexedDB.open(myDB.name); result.onerror = function (e) { console.log("Open DB Error!"); d.reject("error"); }; // 正確打開(kāi) result.onsuccess = function (e) { var db = e.target.result; myDB.db = db; d.resolve(db); }; return d.promise; }; _self.openDB = function (name, version, success, upgrade) { var d = $q.defer(); var name = name || myDB.name; var version = version || myDB.version; // 打開(kāi)數(shù)據(jù)庫(kù) var result = window.indexedDB.open(name, version); // 錯(cuò)誤 result.onerror = function (e) { console.log("Open DB Error!"); d.reject(e); }; // 正確打開(kāi) result.onsuccess = function (e) { myDB.db = e.target.result; if (success) success(myDB.db); d.resolve(e); }; // 數(shù)據(jù)庫(kù)版本變更 result.onupgradeneeded = function (e) { myDB.db = e.target.result; if (upgrade) upgrade(myDB.db); d.resolve("upgradeneeded"); }; return d.promise; }; var schema = 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) { var d = $q.defer(); //promise getDb(myDB.db).then(function (db) { var transaction = db.transaction(storeName, 'readonly'); var store = transaction.objectStore(storeName); var result = store.get(key); result.onsuccess = function (e) { _self.result = e.target.result; d.resolve(); }; result.onerror = function (e) { d.reject(); }; }); return d.promise; }; _self.find = function (storeName, key, value) { var d = $q.defer();//promise getDb(myDB.db).then(function(db) { var transaction = db.transaction(storeName, 'readonly'); var store = transaction.objectStore(storeName); var keyRange = IDBKeyRange.only(value); var result = store.index(key).openCursor(keyRange, "next"); var results = []; result.onsuccess = function(event) { var cursor = event.target.result; if (cursor) { results.push(cursor.value); cursor.continue(); } else { d.resolve(results); } }; result.onerror = function (e) { d.reject(); }; }); return d.promise; }; _self.put = function (storeName, value) { var d = $q.defer(); var db = myDB.db || getDb(); var transaction = db.transaction(storeName, 'readwrite'); var store = transaction.objectStore(storeName); if (value !== null && value !== undefined) { store.put(value); d.resolve(); } else { d.reject(); } return d.promise; }; _self.remove = function (storeName, value) { var d = $q.defer();//promise var db = myDB.db || getDb(); var transaction = db.transaction(storeName, 'readwrite'); var store = transaction.objectStore(storeName); var result = store.delete(value); result.onsuccess = function (e) { d.resolve(); }; result.onerror = function (e) { d.reject(); }; return d.promise; }; _self.findAll = function (storeName) { var d = $q.defer();//promise getDb(myDB.db).then(function(db) { var transaction = db.transaction(storeName, 'readonly'); var store = transaction.objectStore(storeName); var result = store.openCursor(); var results = []; result.onsuccess = function (event) { var cursor = event.target.result; if (cursor) { results.push(cursor.value); cursor.continue(); } else { d.resolve(results); } }; result.onerror = function (e) { d.reject(); }; }); return d.promise; }; return _self; }); }(window, window.angular)); myUsers.js (應(yīng)用的controller層腳本) 'use strict'; angular.module('myApp', ['db']).controller("userCtrl", function($scope, $http, jdbc) { // 刷新數(shù)據(jù)結(jié)構(gòu),angularjs的雙向綁定會(huì)自動(dòng)幫我們渲染界面 function reload() { jdbc.findAll("customer").then(function(response) { if (!response) { $http.get("data.json").success(function(response) { $scope.users = response; }); return; } $scope.users = response; }); } // 數(shù)據(jù)結(jié)構(gòu)完成之后刷新界面 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) { // 從數(shù)據(jù)庫(kù)刪除記錄之后刷新表格數(shù)據(jù) jdbc.remove("customer", id).then(reload); }; $scope.saveCustomer = function() { // 從數(shù)據(jù)庫(kù)添加或更新記錄之后刷新表格數(shù)據(jù) jdbc.put("customer", _user).then(reload); }; jdbc.find("customer", "customer_fName_index", "林").then(function(data) { console.log(data); }); }); data.json(當(dāng)indexedDB無(wú)法正常獲取的時(shí)候用來(lái)顯示數(shù)據(jù)用) [ { "id": 1, "fName": "林", "lName": "嘉斌", "telephone": "13514087953" }, { "id": 2, "fName": "陳", "lName": "曉", "telephone": "13509890786" } ]
以上所述是小編給大家?guī)?lái)的indexedDB bootstrap angularjs之 MVC DOMO (應(yīng)用示例)的全部敘述,希望對(duì)大家有所幫助!
相關(guān)文章
AngularJS+Node.js實(shí)現(xiàn)在線(xiàn)聊天室
隨著互聯(lián)網(wǎng)和信息技術(shù)的發(fā)展,如何快速構(gòu)建高效、強(qiáng)大的動(dòng)態(tài)網(wǎng)站成為很多人研究的熱點(diǎn)。該文將結(jié)合AngularJS和Node.js構(gòu)建一個(gè)在線(xiàn)聊天室,體現(xiàn)AngularJs和Node.js整合的優(yōu)點(diǎn)。2015-08-08AngularJS實(shí)現(xiàn)select的ng-options功能示例
這篇文章主要介紹了AngularJS實(shí)現(xiàn)select的ng-options功能,結(jié)合實(shí)例形式分析了AngularJS使用ng-options操作select列表的相關(guān)實(shí)現(xiàn)技巧,需要的朋友可以參考下2017-07-07利用Angular.js限制textarea輸入的字?jǐn)?shù)
相信在大家已經(jīng)學(xué)習(xí)了足夠多關(guān)于AngularJS的知識(shí)后,就可以開(kāi)始創(chuàng)建第一個(gè)AngularJS應(yīng)用程序,這篇文章通過(guò)示例給大家介紹如何利用Angular.js限制textarea輸入的字?jǐn)?shù),有需要的朋友們可以參考借鑒,下面來(lái)一起看看吧。2016-10-10Angular發(fā)布1.5正式版,專(zhuān)注于向Angular 2的過(guò)渡
Angular團(tuán)隊(duì)最近發(fā)布了Angular 1.5的正式版,該版本實(shí)現(xiàn)了一次重大的升級(jí),它讓仍在使用1.X版本的開(kāi)發(fā)者將能夠更容易地過(guò)渡到Angular 2的開(kāi)發(fā)2016-02-02AngularJS中一般函數(shù)參數(shù)傳遞用法分析
這篇文章主要介紹了AngularJS中一般函數(shù)參數(shù)傳遞用法,結(jié)合實(shí)例形式分析了模型參數(shù)與普通參數(shù)的具體功能與使用技巧,需要的朋友可以參考下2016-11-11Angular模版驅(qū)動(dòng)表單的使用總結(jié)
這篇文章主要介紹了Angular模版驅(qū)動(dòng)表單的使用總結(jié),本文實(shí)現(xiàn)了Angular支持表單的雙向數(shù)據(jù)綁定,校驗(yàn),狀態(tài)管理,非常具有實(shí)用價(jià)值,需要的朋友可以參考下2018-05-05Angular.JS中的指令引用template與指令當(dāng)做屬性詳解
這篇文章主要介紹了Angular.JS中的指令引用template與指令當(dāng)做屬性的相關(guān)資料,文中介紹的非常詳細(xì),對(duì)大家具有一定的參考價(jià)值,需要的朋友們下面來(lái)一起看看吧。2017-03-03淺談angular4 ng-content 中隱藏的內(nèi)容
本篇文章主要介紹了淺談angular4 ng-content 中隱藏的內(nèi)容,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2017-08-08