indexedDB bootstrap angularjs之 MVC Demo

来源:http://www.cnblogs.com/gabin/archive/2016/06/19/5598197.html
-Advertisement-
Play Games

前端之MVC應用 1、indexedDB(Model) -- 前端瀏覽器對象型資料庫,一般我們後臺用的資料庫都是關係型資料庫。那麼indexeddb有什麼特點呢: 首先,從字義上它是索引型資料庫,從實際使用中可以體現為,它需要為表創建索引才可以根據某個欄位來獲取數據,而在關係型資料庫中,這明顯是不需 ...


前端之MVC應用  

  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

<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8">
    <meta name="viewport" content="width=device-width"/>
    <!-- 新 Bootstrap 核心 CSS 文件 -->
    <link rel="stylesheet" href="//cdn.bootcss.com/bootstrap/3.3.5/css/bootstrap.min.css">
    <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>&nbsp;&nbsp;Edit
                </button>
                <button class="btn" ng-click="deleteUser(one.id)">
                    <span class="glyphicon glyphicon-remove"></span>&nbsp;&nbsp;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(作為一個數據訪問的模塊,可供各個應用載入調用)

'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) {
                    // 初始化 用戶
                    var customer = db.createObjectStore('customer', {keyPath:"id", autoIncrement: true});
                    customer.createIndex("customer_fName_index", "fName", {unique: true});
                }
            }
        };
        // 用於處理跟回調函數相反的方式,當defer調用resolve方法之後,就會觸發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秒之後將會列印出"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);
            }
            // 打開資料庫
            var result = window.indexedDB.open(myDB.name);
            result.onerror = function (e) {
                console.log("Open DB Error!");
                d.reject("error");
            };
            // 正確打開
            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;
            // 打開資料庫
            var result = window.indexedDB.open(name, version);
            // 錯誤
            result.onerror = function (e) {
                console.log("Open DB Error!");
                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");
            };
            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 (應用的controller層腳本)

'use strict';
angular.module('myApp', ['db']).controller("userCtrl", function($scope, $http, jdbc) {
    // 刷新數據結構,angularjs的雙向綁定會自動幫我們渲染界面
    function reload() {
        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"
  }
]

 

              


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • shell變數的賦值、變數的取值、變數的取消與查看、局部變數/用戶變數、全局變數/環境變數、特殊變數 ...
  • 本文將介紹Java多線程開發必不可少的鎖和同步機制,同時介紹sleep和wait等常用的暫停線程執行的方法,並詳述synchronized的幾種使用方式,以及Java中的重入鎖(ReentrantLock)和讀寫鎖(ReadWriteLock),之後結合實例分析了重入鎖條件變數(Condition)... ...
  • 1 設計模式 類是我們面向對象編程的承載工具,可以說是面向對象的起點。 設計模式,這種算面向對象的進化。按照gof設計模式的分類 設計模式分為:創建型,結構型,行為型。 其中創建型主要和類的創建有關 結構性組織擴展類和類之間的關係 行為型主要擴展的類的訪問 這三個對應到類上 創建型模式對應的是構造函 ...
  • 數組的增加 ary.push() 向數組末尾添加元素,返回的是添加後新數組的長度,原有數組改變 ary.unshift() 向數組開頭添加元素,返回的是添加後新數組的長度,原有數組改變 var ary=[1,2,3,4]; var res=ary.unshift(6); console.log(re ...
  • 先上代碼,下麵是使用例子。 上面是HTML代碼,下麵是調用方法。 調用方法很簡單吧! 再來一個處理多行數據的例子。 data2={"data":[{"帳號":"yeruzhao1","name":"葉如兆","avatar":"http:\/\/shp.qpic.cn\/bizmp\/3eJCszw ...
  • 前言: 上周天的時候有個學長找我幫忙做三張頁面,因為沒有數據交換之類的,只是單純的前端頁面,想著好久沒做東西, 看書都看煩了,所以就接了也當是練手。之前因為沒有系統的看書,所以其實很多問題都考慮的不全面,屬於知其然不知其所以然的狀態,雖然現在也還有很多要學的東西,但是知道自己的不足總比不知道強吧?而 ...
  • var myDate = new Date();myDate.getYear(); //獲取當前年份(2位)myDate.getFullYear(); //獲取完整的年份(4位,1970-????)myDate.getMonth(); //獲取當前月份(0-11,0代表1月)myDate.getDa ...
  • 註:本實例JS部分均以原生JS編寫,不善用原生JS的,可用jQuery等對三方框架改寫 先上效果圖:(樣式有點醜,可以忽略一下下,效果出來了就好,後期加到其他項目中方便更改0.0) 類似翻書效果,原本的意思是使用JS來控制的,點擊一次之後使用setInterval去控制書頁翻過去的動畫,當書頁翻轉1 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...