Javascript Angularjs、Typescript、Uglify未能实例化模块myApp。。。。未知提供程序:a

Javascript Angularjs、Typescript、Uglify未能实例化模块myApp。。。。未知提供程序:a,javascript,angularjs,dependency-injection,typescript,Javascript,Angularjs,Dependency Injection,Typescript,我在使用带有angularjs的typescript注入自定义服务时收到此错误。生成的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:

我在使用带有angularjs的typescript注入自定义服务时收到此错误。生成的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) 
Uncaught错误:[$injector:modulerr]未能实例化模块myApp,原因是:
错误:[$injector:modulerr]未能实例化模块MyModule,原因是:
错误:[$injector:unpr]未知提供程序:a
http://errors.angularjs.org/1.2.21/$injector/unpr?…2)
见普朗克:

我知道它的工作原理是通过改变丑陋的选项来移除马槽,但我想保留马槽


任何帮助都将不胜感激:-)

这是因为丑八怪试图注入一个名为a的对象,而没有在$inject寄存器中告诉角度注入器该对象的名称

在丑陋之前使用ngMin

使用(编辑):


这是因为丑八怪试图注入一个名为a的对象,而没有告诉角度注入器$inject寄存器中该对象的名称

在丑陋之前使用ngMin

使用(编辑):


这是因为缩小会替换输入参数名和函数名。那么你的情况呢

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被重命名为“b”,您的代码仍然试图注入“LocationService”,这显然是不存在的


一种选择可能是使用ngMin或ngAnnotate(我没有尝试过这些),但我个人的偏好是使用内联数组表示法声明依赖项以避免此问题。

原因是缩小了输入参数名和函数名。那么你的情况呢

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被重命名为“b”,您的代码仍然试图注入“LocationService”,这显然是不存在的


一种选择可能是使用ngMin或ngAnnotate(我没有尝试过),但我个人的偏好是使用内联数组表示法来声明依赖项以避免此问题。

我明确使用$inject来告知服务名称。不确定ng min在这种情况下是否有效您忘了在MyModule中注入$routeProvider:)无法使其工作:-(您是否有可能更改plunker以更正我的尝试:-)好的,使用此命令使其工作<代码>angular.module('MyModule',['ngRoute']).config(['$routeProvider',function($routeProvider){$routeProvider.when('/',{controller:'MainController',templateUrl:'sub.html'});}]).service('LocationService',My module.LocationService.).controller('MainController',My module.MainController')当然,这就是您应该使用ngmin的目的,而不是混合使用$inject和注入数组。我显式地使用$inject来告诉您服务名称。不确定ng min在这种情况下是否有效您忘了在MyModule中注入$routeProvider:)无法使其工作:-(您是否有可能更改plunker以更正我的尝试:-)好的,使用此命令使其工作<代码>angular.module('MyModule',['ngRoute']).config(['$routeProvider',function($routeProvider){$routeProvider.when('/',{controller:'MainController',templateUrl:'sub.html'});}]).service('LocationService',My module.LocationService.).controller('MainController',My module.MainController')当然,这就是您应该使用ngmin的原因,而不是混合使用$inject和injection数组。a.LocationService=b,尽管LocationSercice仍然存在。调试MyModule.LocationService时存在。我不确定如何使用ngMin,ngAnnotate,因为这些控制器是从typescript类自动生成的,这就是为什么我使用$inject=[“LocationService”]。a.LocationService=b,LocationSercice仍然存在。调试MyModule.LocationService时存在。我不确定如何使用ngMin、ngAnnotate,因为这些控制器是从typescript类自动生成的,这就是为什么我使用$inject=[“LocationService”]。