ng-strict-di

2014-09-02T00:00:00+00:00 angular.js JavaScript

参考: angular1.3から追加されるng-strict-diを使ってminifyに強くする。

っていう本が出るそうで、その関連でng-strict-diっていうのがあるとのことを知ったので色々検証してみた。詳しくは上記の参考サイト見りゃいい

angular.module("sample", [])
  .controller("SampleCtrl", function($scope) {
    $scope.message = "hoge";
  });

適当だけど、こういうコードがあった場合にもし使ってるJavaScriptを圧縮するようなツールを使って

angular.module("sample", []).controller("SampleCtrl", function($a) {$a.message = "hoge";});

みたいに圧縮されたような場合が出たらまず引数の依存性注入を解決できない。そこで何を注入するのかを示すDependency Annotationっていうのがある模様。ng-strict-diは依存性注入等?においてDependency Annotationを指定されていないとエラーになるようになる。つまりは

<!DOCTYPE html>
<html ng-app="sample" ng-strict-di>
  <head>
    <script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.3.0-rc.0/angular.min.js"></script>
    <script src="main.js"></script>
  </head>
  <body ng-controller="SampleCtrl">
    {% raw %}{{ message }}{% endraw %}
  </body>
</html>

っていうようなHTML側な場合に上記(1つ目)のJavaScriptを利用するような場合だと、「Error: $injector:strictdi Explicit annotation required」というようなエラーになる。要はDependency Annotationを入れれば良いので

angular.module("sample", [])
  .controller("SampleCtrl", ["$scope", function($scope) {
    // 以下省略
  }]);

っていうように何を注入するのかを明確に示すようにDependency Annotationを指定するべきだっていうのを明確化させる為に使う物かと

んまぁわかりづらいけど要は「何を注入するのか明確にしろバカヤロー」って事なんじゃないかと(※ソース読んで理論付けしてない)

んまぁangular.jsリファレンス欲しい

追記

ngminを使ってminifyする場合にはDependency Annotationは指定される模様。但し、現時点でngminはdeprecatedみたいな感じでng-annotateを使うように促される。

ng-annotateを使うと

function hoge($scope) {
}

みたいなコード書いて

ng-annotate -a main.js -o main.annotate.js

なんてやっても変わらないんだけど

/\*@ngInject*/
function hoge($scope) {
}

みたいなアノテーションを付けてやれば

function hoge($scope) {
}
hoge.$inject = ["$scope"];

な感じでDependecy Annotationが生成されるような感じかと

ActiveRecord Validation #5 - Common Validation Options/Strict Validation - ActiveRecord Validation #4 - validates_each -