【问题标题】:"unknown provider" for dependency declared on provider $get function... but only in minified code在提供者 $get 函数上声明的依赖项的“未知提供者”......但仅限于缩小代码
【发布时间】:2015-08-12 19:51:02
【问题描述】:

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

我有一个服务提供者,该服务具有打开(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... 

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

【问题讨论】:

  • 我对提供者的了解不够多,无法回答,但您在缩小示例中的上述设置似乎与docs 中描述的设置不匹配。也许有一些东西。

标签: javascript angularjs


【解决方案1】:

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

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

此外,除非您有令人信服的理由,否则我建议使用 angular service 或 factory 简写而不是 provider。

来自the docs:

Provider 配方是核心配方类型,所有其他配方类型只是其之上的语法糖。它是功能最多的最冗长的配方,但对于大多数服务来说,它是矫枉过正的。

Provider recipe 在语法上定义为实现 $get 方法的自定义类型...如果您定义 Factory recipe,则会在后台自动创建一个带有 $get 方法设置为您的 factory 函数的空 Provider 类型。

【讨论】:

  • 我确实有一个令人信服的理由来使用提供程序(它需要在配置时可用),并且它是一个提供程序,而不是一项服务,因此您的回答无关紧要。把你的你不能将非提供者依赖注入到提供者中,而是将它们注入到它的 $get 函数中,我已经这样做了。
  • 我明白了。那么你的错误必须存在于你的提供者之外。我试图在 plunkr 中重现该问题:plnkr.co/edit/hheS66kJUqq9UVZ0sVPC?p=preview(不包括MyConstant)但无法做到。你能粘贴你的 gulp 文件吗?
猜你喜欢
  • 1970-01-01
  • 2021-09-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-01-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多