Angular(服務、存儲機制)

Angular(服務、存儲機制)

服務

  • 1.provider

    • 最大的服務,可以配置
    • 特點
      • (1)moren provider 會被自動實例化
      • (2)在控制器中使用會調用$get
      • (3)後續操作寫在$get之後
        <div ng-controller="twoCtrl"></div>
        <script>
        var app=angular.module('appModule',[]);
         app.config(function (CalcProvider) {//CalcProvider 是Calc聲明的函數的實例   就是下邊的this
            CalcProvider.currency='RMB';   //會等provider創建好實例後才能配置
        
        });
         //localStorage
        app.provider('Calc',function () {
            this.currency='$';
            this.$get=function () { //構造函數    this在哪個函數中就是哪個函數的實例
                return {//返回一個對象,用來公用的對象
                    '+':(a, b) =>{
                        return this.currency+(a+b)
                    }
                }
            }
        });
         app.controller('oneCtrl',function ($scope,Calc) {
            console.log(Calc['+'](1,2))
        });
  • 2.factory
    • 不支持配置(配置在factory之前就完成了)
    • 基於provider的
    • 參數2處的函數是provider中$get所對應的
    • return之後
<div ng-controller="oneCtrl"></div>
 app.factory('Calc',function () {//後面的函數是provider中$get方法對應的
      this.currency='RMB';
        return {
            '+':(a, b) =>{
                return this.currency+(a+b)
            }
        }
    });
    app.controller('oneCtrl',function ($scope,Calc) {
        console.log(Calc['+'](1,2))
    });
  • 3.service
    • factory返回的對象,是service函數實例化後的結構
    • 沒有return,之間書寫要執行的操作
<div ng-controller="oneCtrl"></div>
<script>
    var app=angular.module('appModule',[]);
    app.service('Calc',function () {
      this['+']=(a,b)=>a+b;
        //factory返回的對象,是service函數實例化後的結構
       /* return {
            '+':(a, b) =>{
                return this.currency+(a+b)
            }
        }*/
    });//後面的函數就是$get函數
    app.controller('oneCtrl',function ($scope,Calc) {
        console.log(Calc['+'](1,2))
    });
    </script>
  • 4.value/content
    • 調用的是factory
    • 參數2的位置,直接書寫要進行的操作
value:
<div ng-controller="oneCtrl"></div>
<script>
    var app=angular.module('appModule',[]);
     app.value('Calc', {
    '+':(a,b)=>a+b,
    '-':(a,b)=>a-b

    });
    app.controller('oneCtrl',function ($scope,Calc) {
        console.log(Calc['+'](1,2))
    });
</script>
contnet:
<div ng-controller="oneCtrl"></div>
<script>
    var app=angular.module('appModule',[]);
      app.constant('Calc', {
        '+':(a,b)=>a+b,
        '-':(a,b)=>a-b
    });
    app.controller('oneCtrl',function ($scope,Calc) {
        console.log(Calc['+'](1,2))
    });
</script>

存儲機制

  • 本地存儲(Storage)

    <script>
    var app = angular.module('appModule', []);
    app.provider('Storage', function () {
        this.$get = function () {
            return {
                setStorage: function (key, value) {
                    if (typeof value == 'object') {
                        value = JSON.stringify(value)
                    }
                    localStorage.setItem(key, value)
                },
                getStorage: function (key) {
            var str=localStorage.getItem(key);
                    if(str.startsWith('{')||str.startsWith('[')){
                        str=JSON.parse(str);
                    }
                    return str
                }
            }
    
        }
    });
    app.controller('oneCtrl', function ($scope,Storage) {
        Storage.setStorage('name', {name: 'www'});
    });
    app.controller('twoCtrl', function ($scope,Storage) {
    console.log(Storage.getStorage('name').name)
    })
    </script>
  • 事件交互

    • $on監聽
      • 監聽當前發生的事
      • 平級的監聽放在根作用域上
      • 與發送的內容一致
      • 參數1:當前事件源
      • 參數2:被操作數據
    $scope.$on('買了雪碧',function (e,data) {
            $scope.total=data;
            console.log(data);
        });
    • $watch監視
      • watch+apply可以實現雙向數據綁定
      • 實時監控數據
      • 參數1:被監控的對象(可以是作用域上的屬性名,也可以是函數)–》發生變化的元素
      • 參數2:監控到對象變化後執行的操作
      $scope.$watch('count',function () {
            $scope.$emit('買了雪碧',$scope.count*$scope.price);//數量變化向上發射
        });
    • $emit向上發射幷包括自己
      • 發射的內容和被監聽的內容一致
     $scope.$watch('count',function () {
            $scope.$emit('買了雪碧',$scope.count*$scope.price);//數量變化向上發射
        });
    • $broadcast 向下發射包括自己

      • 一般用於有包含關係元素之間的交互
      • 代表級別大的(父級)向級別小的(子級)發送
      • 參數1 是監控對象的名字
      • 參數2 是監控對象的真實內容變化對象本體)
      $scope.$watch('total',function () {
          $scope.$broadcast('總共',$scope.total)
      })
    • 以上均針對上下級交互,平級之間的事件交互,採用方式一致,唯一區別在於,平級交互不需要使用broadcast進行事件發射,只採用$emit即可
    • 存在監聽可能是發佈訂閱模式
  • $interval\$timeout

    • 不是angular中的視圖改變數據不會刷新
    • angular中的服務都可以自動調用$apply
    {{date | date:'hh:mm:ss'}}
    <script>
     var app=angular.module('appModule',[]);
      app.controller('myCtrl',function ($scope,$interval,$timeout) {//$interval單次    $timeout多次
         //不是angular中的方法中改變數據不會刷新視圖
        var timer=$interval(function () {//angular中提供的服務都可以自動調用$apply,不需要手動調用
             $scope.date=Date.now();
             $interval.cancel(timer);//取消定時器
         });
     },1000);
     </script>
    • $Apply

      • 強制刷新視圖
      <input type="text" zf-model="aa">{{aa}}
       var app=angular.module('appModule',[]);
      app.run(function ($rootScope) {
      $rootScope.aa='zfpx'
      });
      app.directive('zfModel',function () {
      return {
          restrict:'A',
          link:function (scope,element,attrs) {
        element.on('input',function () {//監聽輸入框中的輸入事件
      //              scope.age=element.val();
            scope[attrs.zfModel]=element.val();
            scope.$apply();//強制讓視圖刷新
        });
              scope.$watch(attrs.zfModel,function (newVal) {
                  element.val(newVal);
              })
          }
      }
      })
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章