搜尋

首頁  >  問答  >  主體

angular.js - angularJS依賴注入的標準

我在使用各大社區查關於angular的知識的時候,經常看到兩種依賴注入的模式,有的是controller.('Ctr',[$scope,function($scope){...}]);
有的直接是controller.('Ctr',function($scope){...});
想請教一下後面這個是新的模式而且通用的嗎?

大家讲道理大家讲道理2790 天前714

全部回覆(3)我來回復

  • 滿天的星座

    滿天的星座2017-05-15 17:02:16

    最佳實踐是用:controller.('Ctr',['$scope',function($scope){...}])。

    1. 如@Deboy所說,為了js壓縮。

    2. 性能更優。 (controller.('Ctr',function($scope){...})的寫法,angularjs會解析這個function的參數,最後得到要注入的內容,而數組式的寫法能跳過解析這一步,性能上會更好)。附上源碼供參考:

    function annotate(fn, strictDi, name) {
      var $inject,
          fnText,
          argDecl,
          last;
    
      if (typeof fn === 'function') {
        if (!($inject = fn.$inject)) {
          $inject = [];
          if (fn.length) {
            if (strictDi) {
              if (!isString(name) || !name) {
                name = fn.name || anonFn(fn);
              }
              throw $injectorMinErr('strictdi',
                '{0} is not using explicit annotation and cannot be invoked in strict mode', name);
            }
            fnText = fn.toString().replace(STRIP_COMMENTS, '');
            argDecl = fnText.match(FN_ARGS);
            forEach(argDecl[1].split(FN_ARG_SPLIT), function(arg) {
              arg.replace(FN_ARG, function(all, underscore, name) {
                $inject.push(name);
              });
            });
          }
          fn.$inject = $inject;
        }
      } else if (isArray(fn)) {
        last = fn.length - 1;
        assertArgFn(fn[last], 'fn');
        $inject = fn.slice(0, last);
      } else {
        assertArgFn(fn, 'fn', true);
      }
      return $inject;
    }

    回覆
    0
  • 天蓬老师

    天蓬老师2017-05-15 17:02:16

    因為前端優化的過程中會對js等檔案進行壓縮等處理,會把一些字串給替換成單個字母,如果是這樣會導致angular注入失敗,後面那個是沒有做防止壓縮後無法注入的處理的前一個做了這個處理所以即使壓縮了也不會導致注入失敗

    開發階段兩個執行的效果是一樣

    回覆
    0
  • 曾经蜡笔没有小新

    曾经蜡笔没有小新2017-05-15 17:02:16

    angular的依赖注入的实现方式,没有什么规范/标准可谈,但却是不错的思路。
    我之前写过一篇教程,教你手写一个类似angular的依賴注入系統,希望對你有用:BDD手寫依賴注入

    回覆
    0
  • 取消回覆