問題
如下代碼所示, 如果在angular中配置route的resolve屬性時, 在自動化代碼混淆壓縮后 angular運行報錯谭跨,服務(Service)的注入通過“數(shù)組標注在方法的參數(shù)中聲明依賴”就可以了,控制器中的服務注入寫法也要數(shù)組的方式注入礁蔗,因為服務的實例化是通過字符串中的名字來實例化的,代碼壓縮混淆后會把服務對象變量名替換了雁社。
解決:
```
$routeProvider
.when("/page", {
controller: "MyCtrl",
templateUrl: "test.html",
resolve: {
resolveService: ['MyService', function (MyService) {
return MyService();
}]
}
})
```
最近(2017年4月1日)又發(fā)現(xiàn)一個因javascript代碼壓縮混淆后運行報錯的問題浴井,如圖:
乍一看,有關(guān)鍵字provider霉撵,就往上面遇到的問題想了磺浙,想到了是壓縮混淆代碼后報錯,那是哪個地方呢徒坡。把controller和route中resolve撕氧,還有服務(service,factory)崭参,filter呵曹,directive款咖,都檢查了一下何暮,都是按“數(shù)組標注在方法的參數(shù)中聲明依賴”。
由于是單獨這一個頁面報錯铐殃,肯定是這個頁面require的服務(service海洼,factory),filter富腊,directive有問題坏逢,后來發(fā)現(xiàn)是指令(directive中controller屬性的寫法沒有用數(shù)組標注聲明依賴)
controller: function ($scope) {
這段代碼壓縮混淆后成了controller: function (s) {
找不到$scope上下文變量了,
===========================割===============================
angular在執(zhí)行某些方法(例如在服務的工廠方法、控制器構(gòu)造方法)時會借助注入器(injector)是整。 可以通過以下三種方式注入服務:
1.通過數(shù)組標注在方法的參數(shù)中聲明依賴(優(yōu)先考慮)
module.controller('MyController', ['$scope','greeter', function($scope, greeter) {//...}]);
2. 定義在控制器構(gòu)造方法的$inject屬性中
```
var MyController = function($scope, greeter) {// ...}
MyController.$inject= ['$scope','greeter'];
module.controller('MyController', MyController);
```
3.通過方法參數(shù)名隱式的添加(有些注意事項)
```
module.controller('MyController', function($scope, greeter) {//...});
```
這種方式不能和JavaScript的代碼混淆器一起使用肖揣。可以通過ng-annotate在minifying之前隱式的添加依賴浮入。
參考:http://www.tuicool.com/articles/uEB3Mj