“未知提供程序”用于在提供者$ get函数上声明的依赖项...但仅限于缩小代码

时间:2015-08-12 19:51:03

标签: javascript angularjs

我有一个角度(1.4.3)应用程序和一个gulp管道,它使用ngAnnotate和uglify来最小化它。

我有一个服务的Provider,它有一个打开(ui.bootstrap)模式的函数:

angular.module('myapp', ['ui.bootstrap'])
   .provider('AuthUser', function(){  

        return {
            //stuff
            $get: function($q, MyConstant, $modal){ 

                  return {
                      showLoginModal : showLoginModal
                  }

                 function showLoginModal() { 
                    $modal.open({ 
                         templateUrl: '/path/to.html'
                         //stuff
                     });
                 }
            }
        }
    }

这在开发模式下工作正常(非最小化),并且在节点开发服务器上运行时,最小化的代码在我的本地(Windows)计算机上运行良好。但是,当我将代码拉入我的AWS(ubuntu)实例gulp build并静态提供服务时,我崩溃了$injector:unpr: Unknown provider: Provider <-

错误消息本身(以及我给出的corresponding error reference link)并没有告诉我缺少哪个提供程序,它们只有一个空白区域。在跟踪之后,我可以看到它在$modal.open()的调用中发生,因此假设缺少的依赖是$modal,但无法找出原因。

MyConstant被注入并在服务的其他地方使用而没有问题,因此我认为这不是最小化问题,但是对于记录,这里是如何最小化:

angular.module("civ.core").provider("AuthUser", function() {
    var e = this;
    return e.token = null ,
    e.user = null ,
    {
        initialize: function(t) {
            e.token = t.token,
            e.user = t.user
        },
        $get: ["$http", "$q", "$localStorage", "$modal", "DEVELOPMENT", "PRODUCTION", function(t, i, n, o, s, a) {
            function l(e, i) {
                t.defaults.headers.common.token = "Token " + e,
                t.defaults.headers.common.user = i
            }
            function r() {
                console.log("instantiating"),
                console.log(e),
                x.user = e.user,
                x.authToken = e.token,
                x.user.anonymous && (x.user.votes = {},
                x.user.pinnedTags = [])
            }
            function c(e) {
                return o.open({
                    templateUrl: "app/core/templates/login.html",
                    //stuff... 

那就是说,这是我第一次尝试缩小和吞咽 - 所以帮助我......

1 个答案:

答案 0 :(得分:0)

您当然需要将$modal服务注入您自己的服务:

angular.module('myapp', ['ui.boostrap'])
    .service('AuthUser', ['$modal',
        function ($modal) {
            //stuff with your modal
    }])

此外,除非您有令人信服的理由,否则我建议使用有角度的servicefactory缩写代替provider

来自the docs

  

提供者配方是核心配方类型,所有其他配方类型都只是语法糖。它是最具功能性的最详细的配方,但对于大多数服务而言,它是过度的。

     

提供程序配方在语法上定义为实现$ get方法的自定义类型...如果定义了Factory配方,则会自动创建一个将$ get方法设置为工厂函数的空Provider类型。