Anglarサービスの依存注入とコード圧縮の問題
3026 ワード
AnglarJSは注入機構に優れた依存性を提供する.以下の5つのコアコンポーネントは依存注入として使用される. value factory service プロバイダー constant valueは、コントローラに値(構成段階)を渡すための簡単なjavascriptオブジェクトです. constant(定数)は、設定段階において数値を伝達するために使用され、この定数は、設定段階では利用できないことに注意されている. factoryは、計算または戻り値の関数です. providerでは、value/service/factoryを返すためのfactory方法get()が提供されている.
AnglarJSは、コントローラの構造関数のパラメータ名から依存サービス名を推定するためである.ですから、コントローラのJSコードを圧縮すると、そのパラメータは同時に圧縮されます.この時は注入システムに依存して、サービスを正確に識別することができなくなります.圧縮前のコードのように:
//
var mainApp = angular.module("mainApp", []);
// value "defaultInput"
mainApp.value("defaultInput", 5);
// "defaultInput"
mainApp.controller('CalcController', function($scope, CalcService, defaultInput) {
$scope.number = defaultInput;
$scope.result = CalcService.square($scope.number);
$scope.square = function() {
$scope.result = CalcService.square($scope.number);
}
});
mainApp.constant("configParam", "constant value");
//
var mainApp = angular.module("mainApp", []);
// factory "MathService" provides a method multiply to return multiplication of two numbers
mainApp.factory('MathService', function() {
var factory = {};
factory.multiply = function(a, b) {
return a * b
}
return factory;
});
// service factory "MathService"
mainApp.service('CalcService', function(MathService){
this.square = function(a) {
return MathService.multiply(a,a);
}
});
//
var mainApp = angular.module("mainApp", []);
// provider service
mainApp.config(function($provide) {
$provide.provider('MathService', function() {
this.$get = function() {
var factory = {};
factory.multiply = function(a, b) {
return a * b;
}
return factory;
};
});
});
コード圧縮問題AnglarJSは、コントローラの構造関数のパラメータ名から依存サービス名を推定するためである.ですから、コントローラのJSコードを圧縮すると、そのパラメータは同時に圧縮されます.この時は注入システムに依存して、サービスを正確に識別することができなくなります.圧縮前のコードのように:
var app = angular.module('app',[]);
app.controller('MainCtrl', function($scope, $timeout){
$timeout(function(){
console.log($scope);
}, 1000);} );
圧縮すると、次のようになります.app.controller("MainCtrl",function(e,t){t(function(){console.log(e)},1e3)})
じゃMainCtrlが何に依存しているか分かりません.圧縮による問題を克服するためには、コントローラ関数内で$inject属性に依存するサービス識別子の配列を割り当てる限り、MainCtrl.$inject = ['$scope', '$timeout'];
もう一つの方法は、依存リストを指定し、圧縮問題を回避するためにも使用できます.Javascript配列を使用してコントローラを構成します.注入するサービスを文字列配列(依存の名前を表す)に置いて、配列の最後の要素はコントローラの方法函数です.app.controller('MainCtrl', ['$scope', '$timeout', function($scope, $timeout){ $timeout(function(){
console.log($scope);
}, 1000);} ]);
上記の2つの方法はいずれもAnglar JSの注入可能な関数と完璧に協力できます.どのような方法を選ぶかは完全にあなたたちのプロジェクトのプログラミングスタイルに依存します.配列方式を使うことを提案します.