欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

自學(xué)實(shí)現(xiàn)angularjs依賴注入

 更新時(shí)間:2016年12月20日 14:16:07   作者:zhanglearning  
這篇文章主要為大家詳細(xì)介紹了angularjs依賴注入的自己成果,如何實(shí)現(xiàn)angularjs依賴注入,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下

    在用angular依賴注入時(shí),感覺很好用,他的出現(xiàn)是 為了“削減計(jì)算機(jī)程序的耦合問題” ,我懷著敬畏與好奇的心情,輕輕的走進(jìn)了angular源碼,看看他到底是怎么實(shí)現(xiàn)的,我也想寫個(gè)這么牛逼的功能。于是就模仿著寫了一個(gè),如果有什么不對(duì),請(qǐng)大家批評(píng)指正。

     其實(shí)剛開始的時(shí)候我也不知道怎么下手,源碼中有些確實(shí)晦澀難懂,到現(xiàn)在我也沒有看明白,于是我就靜下心想一想,他是怎么用的,如下所示:

angular.module(/*省略*/)
 .factory("xxxService", ['xx',function (xx) {
  return {
    //省略
  }
 }])
 .controller('iiController',['xxxService',function(xxxService){
  //省略
 }]);
/*...方法省略..*/

    看看上面嚴(yán)格模式下的使用方式,先不去看源碼,如何實(shí)現(xiàn)service重用,controller不重用呢? 我就按照自己的想法創(chuàng)建一個(gè)cache用于保存service,controller 只運(yùn)行一次,不保存到cache中。

有了點(diǎn)思路,就把該有的東西先寫了,

(function (global) {
 function CreateInjector(cache){
  this.cache=cache;//用于保存service的cache
 }
 function Angular(){}
 Angular.module=function(){
  var moduleObj={};
  return {
   injector:new CreateInjector(moduleObj),
   factory:function(name,fn){
   },
   controller:function(name,fn){
   }
  }
 };
 global.angular = Angular;
})(window);

    上面兩個(gè)構(gòu)造函數(shù),一個(gè)是創(chuàng)建構(gòu)造器,一個(gè)是angular 的靜態(tài)module(不用創(chuàng)建直接用 "構(gòu)造函數(shù)名.方法名",這里就是想模仿angular.module())方法,這里angular module 的方法我簡寫了,他也有依賴注入,但是我能力有限,先研究了controller和service的注入。上面的方法名字都是我copy于源碼中的,這里我就不解釋他們的具體意義了。

由于我們研究的是依賴注入,真正的核心代碼如下:

var ARROW_ARG = /^([^\(]+?)=>/;
var FN_ARGS = /^[^\(]*\(\s*([^\)]*)\)/m;
var STRIP_COMMENTS = /((\/\/.*$)|(\/\*[\s\S]*?\*\/))/mg;
function isArray(obj){
 return Object.prototype.toString.call(obj) === '[object Array]';
}
function stringifyFn(fn) {
 return fn.toString();
}

function extractArgs(fn) {
 var fnText = stringifyFn(fn).replace(STRIP_COMMENTS, ''),
 args= fnText.match(ARROW_ARG) || fnText.match(FN_ARGS);
 return args[1].split(',');
}
function CreateInjector(cache){
 this.cache=cache;
}
CreateInjector.prototype={
 constructor:CreateInjector,
 invoke:function(fn,self){
  var argsName= extractArgs(fn),argsFn=[];
  argsName.forEach(function(arg){
   argsFn.push(this.cache[arg]);
  },this);
  if(isArray(fn)){
   return fn[fn.length-1].apply(self,argsFn);
  }else{
   return fn.apply(self,argsFn);
  }
 }
};

其中上面的正則表達(dá)式是復(fù)制于源碼中的,代碼原理是:

   (1)把傳來的function toString(),然后用正則match出所傳參數(shù)名,用split把參數(shù)分割成參數(shù)數(shù)組;

   (2)循環(huán)參數(shù)數(shù)組,在cache中找到此參數(shù)名下的函數(shù),push到一個(gè)函數(shù)數(shù)組中;

   (3)利用apply,把函數(shù)數(shù)組當(dāng)成參數(shù),去執(zhí)行函數(shù);

對(duì)于所傳的fn, 判斷是數(shù)組格式,還是普通的,如果是數(shù)組就apply最后的一個(gè)值,也就是函數(shù),否則就是fn自己。

   上面的我沒有做錯(cuò)誤處理,比如注入的找不到等等一些問題,有興趣自己加上吧。

最后所有代碼如下,大家可以復(fù)制運(yùn)行:

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <title>angular injector Demo</title>
</head>
<body>
<script>
(function (global) {
  var ARROW_ARG = /^([^\(]+?)=>/;
  var FN_ARGS = /^[^\(]*\(\s*([^\)]*)\)/m;
  var STRIP_COMMENTS = /((\/\/.*$)|(\/\*[\s\S]*?\*\/))/mg;
  function isArray(obj){
    return Object.prototype.toString.call(obj) === '[object Array]';
  }
  function stringifyFn(fn) {
    return fn.toString();
  }

  function extractArgs(fn) {
    var fnText = stringifyFn(fn).replace(STRIP_COMMENTS, ''),
    args= fnText.match(ARROW_ARG) || fnText.match(FN_ARGS);
    return args[1].split(',');
  }
  function CreateInjector(cache){
    this.cache=cache;
  }
  CreateInjector.prototype={
    constructor:CreateInjector,
    invoke:function(fn,self){
      var argsName= extractArgs(fn),argsFn=[];
      argsName.forEach(function(arg){
        argsFn.push(this.cache[arg]);
      },this);
      if(isArray(fn)){
        return fn[fn.length-1].apply(self,argsFn);
      }else{
        return fn.apply(self,argsFn);
      }
    }
  };
  function Angular(){}
  Angular.module=function(){
    var moduleObj={};
     return {
       injector:new CreateInjector(moduleObj),
       factory:function(name,fn){
         moduleObj[name]=this.injector.invoke(fn);
         return this;
       },
       controller:function(name,fn){
         this.injector.invoke(fn);
         return this;
       }
     }
  };
  global.angular = Angular;
})(window);


angular.module()
  .factory('cacheService',[function(){
    return {};
  }])
  .factory("userInfoService", ['cacheService',function (cacheService) {
    return {
      getUserInfo:function(){
        return cacheService.userInfo;
      },
      setUserInfo:function(value){
        cacheService.userInfo=value;
      }
    }
  }])
  .controller('userController',['userInfoService',function(userInfoService){
    userInfoService.setUserInfo({id:'qqqq11234',name:'zhangLearing'});
    console.log(userInfoService.getUserInfo());
  }]);
</script>
</body>
</html>

謝謝大家!

以上就是本文的全部內(nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • 一篇文章快速了解Angular和Ionic生命周期和鉤子函數(shù)

    一篇文章快速了解Angular和Ionic生命周期和鉤子函數(shù)

    Ionic以AngularJS和ApacheCordova為基礎(chǔ),使用Node.js進(jìn)行模塊管理,使用Html5、Css(SASS)和Javascript技術(shù)進(jìn)行APP開發(fā),這篇文章主要給大家介紹了如何通過一篇文章快速了解Angular和Ionic生命周期和鉤子函數(shù)的相關(guān)資料,需要的朋友可以參考下
    2021-07-07
  • AngularJS模板加載用法詳解

    AngularJS模板加載用法詳解

    這篇文章主要介紹了AngularJS模板加載用法,結(jié)合實(shí)例形式詳細(xì)分析了AngularJS模板加載所涉及的屬性、方法、使用技巧與相關(guān)注意事項(xiàng),需要的朋友可以參考下
    2016-11-11
  • 動(dòng)態(tài)創(chuàng)建Angular組件實(shí)現(xiàn)popup彈窗功能

    動(dòng)態(tài)創(chuàng)建Angular組件實(shí)現(xiàn)popup彈窗功能

    這篇文章主要介紹了動(dòng)態(tài)創(chuàng)建angular組件實(shí)現(xiàn)popup彈窗,需要的朋友可以參考下
    2017-09-09
  • Angular.js去除頁面中顯示的空行方法示例

    Angular.js去除頁面中顯示的空行方法示例

    這篇文章主要介紹了Angular.js去除頁面中顯示的空行方法,文中給出了詳細(xì)的示例代碼供大家參考學(xué)習(xí),相信對(duì)大家具有一定的參考價(jià)值,需要的朋友們下面來一起看看吧。
    2017-03-03
  • AngularGauge 屬性解析詳解

    AngularGauge 屬性解析詳解

    本文主要介紹AngularGauge 屬性的知識(shí),這里這里了詳細(xì)的資料來介紹AngularGauge屬性的內(nèi)容知識(shí),幫助大家學(xué)習(xí)參考,有需要的小伙伴可以參考下
    2016-09-09
  • AngularJS解決ng-if中的ng-model值無效的問題

    AngularJS解決ng-if中的ng-model值無效的問題

    本篇文章主要介紹了AngularJS解決ng-if中的ng-model值無效的問題,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2017-06-06
  • 使用yeoman構(gòu)建angular應(yīng)用的方法

    使用yeoman構(gòu)建angular應(yīng)用的方法

    下面小編就為大家?guī)硪黄褂脃eoman構(gòu)建angular應(yīng)用的方法。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2017-08-08
  • AngularJS初始化過程分析(引導(dǎo)程序)

    AngularJS初始化過程分析(引導(dǎo)程序)

    這篇文章主要介紹了AngularJS初始化過程分析(引導(dǎo)程序),這一節(jié)解釋了AngularJS初始化的過程,以及需要的時(shí)候你該如何修改AngularJS的初始化,需要的朋友可以參考下
    2014-12-12
  • AngularJS 多指令Scope問題的解決

    AngularJS 多指令Scope問題的解決

    本文介紹了AngularJS 多指令Scope問題的解決,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2018-10-10
  • Angular 4依賴注入學(xué)習(xí)教程之ValueProvider的使用(七)

    Angular 4依賴注入學(xué)習(xí)教程之ValueProvider的使用(七)

    這篇文章主要給大家介紹了關(guān)于Angular 4依賴注入之ValueProvider使用的相關(guān)資料,文中介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或者使用Angular4具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來一起看看吧。
    2017-06-06

最新評(píng)論