跳到主要內容

Angularjs Cache Some Values

一個網站中可能會根據不同的需求來切換相關的子頁面,但若直接切換頁面在回來時將發現我們輸入到一半的某些值已清空,因此我們可以利用angularjs中的cacheFactory服務搭配routeProvider切換時的事件來儲存值,而頁面載入時則從cacheFactory中取出cache值。


一、$cacheFactory

從官方的API說明文件得知$cacheFactory可以儲存一些對象並存取,藉由key/value方式來操作。

var cache = $cacheFactory('cacheId');
cache.put("key", "value");
cache.get("key");

二、因此可以設計一個Factory的共用服務來儲存與取出。

(function(){
   angular.module('cacheFactoryModule',[])
        .factory('cacheFactory',function($cacheFactory){
           var cache = $cacheFactory('myCache');
            return{
                putData: function(key,values){
                    cache.put( key, values );
                },
                loadCacheData: function(key){
                    return cache.get(key);
                }
            }
        });
})();

三、設計index.html、main.html、detail.html,在index.html中使用一個<div>標籤,加入ng-view屬性來切換頁面,main.html則列出collection內容,detail.html則根據main.html列出的清單點選進細節頁面,藉由binding顯現出詳細資料,而此則以title簡單的模擬情境。

        (一)index.html
<div class="bg-success center" align="center" ng-view></div>
        (二)main.html已ng-repeat搭配link方式連結到詳細清單頁面。
<div>
<input type="text"
        ng-model="mainInputTextBox"
        placeholder="Search some value..."
        focus is-focus="true"
       />
<div class="playlist">
    <li ng-repeat="dataItem in mainDatas|filter:mainInputTextBox"><a href="#/details/{{$index}}"> {{dataItem.title}}</a></li>
</div>
<a class="btn btn-success" href="#/details/0" >Go to Detail</a>
</div>
         (三)detail.html則show出title,並加入preview、next兩個button來切換下一頁、前一頁。
<div>
<h3><span class="label label-default">{{mainDatas[whichId].title}}</span></h3>
<hr>
<input type="text"
       ng-model="detailInputTextBox"
       placeholder="Please Input somvalue..."
       focus is-focus="true"
        />

<a class="btn btn-success" href="#/main">Go to main.html</a>
<hr>

    <a class="btn btn-info" href="#/details/{{prevGuitar}}">Preview</a>
    <a class="btn btn-info" href="#/details/{{nextGuitar}}">Next</a>
</div>

四、設計cacheAppModule來進行頁面的切換,並加入autoFocus的自訂標籤。

(function(){
   angular.module('cacheAppModule',['ngRoute','cacheControllerModule','kendo.directives'])
        .config(['$routeProvider',function($routeProvider){
        $routeProvider.when('/main',{
            templateUrl: 'main.html',
            controller: 'mainController'
        }).when('/details/:detailsID',{
            templateUrl: 'detail.html',
            controller: 'detailController'
        }).otherwise({
            redirectTo: '/main'
        })
    }]).directive('focus',function($timeout){
           return{
               scope:{
                   isFocus: '='
               },
               link: function(scope,element){
                   scope.$watch('isFocus',function(value){
                       if (value){
                           $timeout(function(){
                               element[0].focus();
                           })
                       }
                   })
               }
           }
       });
})();

五、分別設計mainController及detailController且在兩個controller內加入頁面載入、頁面切換的事件監聽,進行存取cache值的方法。

(function () {
    angular.module('cacheControllerModule', ['ngRoute', 'cacheFactoryModule'])
        .controller('mainController', function (cacheFactory, $scope, $location) {
            $scope.nowPath = $location.path();
            var DataClass = function (title) {
                this.title = title;
            }
            $scope.mainDatas = [new DataClass('This is title for detail1'), new DataClass('This is title for detail2'), new DataClass('This is title for detail3')];
            $scope.$on('$viewContentLoaded', function () {
                $scope.onLoad()
            });
            $scope.$on('$routeChangeStart', function (event, next, current) {
                $scope.routeChangeStart()
            });
            $scope.onLoad = function () {
                var cacheDatas = cacheFactory.loadCacheData($scope.nowPath);
                if (!cacheDatas) return;
                $scope.mainInputTextBox = cacheDatas.mainInputTextBox;
            }
            $scope.routeChangeStart = function () {
                cacheFactory.putData($scope.nowPath, {'mainInputTextBox': $scope.mainInputTextBox});
                cacheFactory.putData('tmpParameter', $scope.mainDatas);
            }
        })
        .controller('detailController', function ($scope, $routeParams, $location, cacheFactory) {
            $scope.nowPath = $location.path();
            $scope.$on('$viewContentLoaded', function () {
                $scope.onLoad()
            });
            $scope.$on('$routeChangeStart', function () {
                $scope.routeChangeStart()
            });
            $scope.onLoad = function () {
                var cacheDatas = cacheFactory.loadCacheData($scope.nowPath);
                if (cacheDatas) $scope.detailInputTextBox = cacheDatas.detailInputTextBox;
                $scope.mainDatas = cacheFactory.loadCacheData('tmpParameter');
                $scope.whichId = parseInt($routeParams.detailsID);
                if ($routeParams.detailsID > 0)
                    $scope.prevGuitar = $scope.whichId - 1;//前一筆
                else
                    $scope.prevGuitar = $scope.mainDatas.length - 1;//小於0則設為最後一筆
                $scope.nextGuitar = ($scope.whichId + 1) % $scope.mainDatas.length;
            }
            $scope.routeChangeStart = function () {
                cacheFactory.putData($scope.nowPath, {'detailInputTextBox': $scope.detailInputTextBox});
            }
        });
})();
p.s存取的技巧則以path當key,然而value則為object方式在存放dataKey/dataValue,而dataKey為變數名稱、dataValue為變數值,取值時則以相同方式取之。

留言

這個網誌中的熱門文章

java西元民國轉換_各種不同格式

C#資料庫操作(新增、修改、刪除、查詢)

【Excel好好玩】 自己的資產自己管!善用Google Sheet來幫我們評估貸款

這次介紹的主題是關於Excel的貸款還款計畫試算,我們人生中總會遇到需要大筆金額的花費,但當資金不夠時就得進行貸款,而貸款之前如果我們能夠審慎評估,並分析自己的還款能力之後在進行凍作,相信風險會小很多,因此就自己動動手來使用Google Sheet進行試算吧! 基本資料 ● 貸款總額: 1000000 ● 貸款期數: 84月 ● 年利率: 2.11% ● 月利率: 0.18% P.S 月利率 = 年利率 / 12 重要函式 PMT : 這是Google Sheet內建的重要年金計算公式,我們可以善用這個公式來計算固定利率及期數的固定攤還本息。因為PMT函式計算出的結果為負數,所以前面加上-號轉成正數。 動手做 首先我們在Excel表上列出我們的基本資料 圖片來源 其中月利率的部分就使用公式「=B4/12」 接著我們填上第一列的期數跟餘額 圖片來源 =B2 =B3 使用關鍵PMT函數來計算本息的部分 因為PMT函式計算出的結果為負數,所以前面加上-號轉成正數。 -PMT(貸款利率(月利率), 貸款期數, 貸款總額) =-PMT($B$5,$B$3,$B$2) 圖片來源 計算利息 利息 = 貸款餘額 x 月利率 =B8*$B$5 圖片來源 計算本金 本金 = 本息 - 利息 =C8-D8 圖片來源 製作第二列餘額的部分 餘額的部分 = 上一期的餘額 - 上一期的本金 圖片來源 接著拖曳該兩列往下拉,即可查看每一期的利息與本金 圖片來源 結語 雖然市面上已經有很多貸款銀行都提供了試算功能,但如果我們想要進一步管理自己的資產時,就需要將每一期的金額給計算出來,因此才會將公式運用在Excel表,讓我們的資產管理表能夠結合負債,進一步評估我們理財行動的下一步,希望這樣的經驗可以幫助到正在理財道路上打拼的夥伴,讓我們透過有效的管理,幫助荷包長大吧! 喜歡撰寫文章的你,不妨來了解一下: Web3.0時代下為創作者、閱讀者打造的專屬共贏平台 — 為什麼要加入? 歡迎加入一起練習寫作,賺取知識,累積財富!