Angularjs,Typescript,Uglify无法实例化模块myApp ....未知提供者:a

时间:2014-08-01 10:39:35

标签: javascript angularjs dependency-injection typescript

我在使用带有angularjs的typescript注入自定义服务时收到此错误。由此产生的打印的JavaScript脚本已经通过uglify运行。未使用uglify部署时该应用程序可以正常工作。

Uncaught Error: [$injector:modulerr] Failed to instantiate module myApp due to:
Error: [$injector:modulerr] Failed to instantiate module MyModule due to:
Error: [$injector:unpr] Unknown provider: a
http://errors.angularjs.org/1.2.21/$injector/unpr?...<omitted>...2) 

请参阅plunker:http://plnkr.co/edit/mX7TCPAO3VycUp4Nw2Oy?p=preview

我知道它可以通过修改uglify选项来删除mangle,但我想继续修改。

非常感谢任何帮助: - )

2 个答案:

答案 0 :(得分:2)

这是因为uglifier尝试注入一个名为a的对象,而不告诉角度注入器$ inject注册表中该对象的名称。

在uglify之前使用ngMin。

使用(编辑):

var config = (function() {
  function modConfig($routeProvider) {
    $routeProvider.when('/', {
        controller: 'MainController',
        templateUrl: 'sub.html'
    });
  }
  modConfig.$inject = ['$routeProvider'];
})();
angular.module('MyModule', ['ngRoute']).config(config);

答案 1 :(得分:2)

原因是缩小替代输入参数名称和函数名称。所以在你的情况下

var LocationService = (function () {
        function LocationService($rootScope) {
            $rootScope.foo = 123;
        }
        LocationService.prototype.log = function (msg) {
            console.log(msg);
        };
        LocationService.$inject = ['$rootScope'];
        return LocationService;
    })();

缩小到

var b=function(){function a(a){a.foo=123}... 
a.$inject=["LocationService"]

所以LocationService被重命名为&#34; b&#34;并且你的代码仍然试图注入&#34; LocationService&#34;,这显然不存在。

一个选项可能是使用像ngMin或ngAnnotate这样的东西(我还没试过这些),但我个人的偏好是使用内联数组表示法来声明依赖关系以避免这个问题。

相关问题