当前位置: 首页 > 面试题库 >

AngularJS-将工厂从另一个模块注入提供程序

隆兴修
2023-03-14
问题内容

我有一个单独模块的工厂,我想将其注入模块的提供程序中,但是却不断收到未知的提供程序错误。我究竟做错了什么?

我想注入的是:

var angularSocketIO = angular.module('socketioModule', []);
angularSocketIO.factory('socketio', [
    '$rootScope', 
    'addr', 
    function($rootScope, addr) {
        var socket = io.connect(addr,{
            'sync disconnect on unload': true
        });
                ...
        return socket;
    }
]);

我试图注入的地方:

angular.module('myApp.services', ['socketioModule'])
    .provider('greeter', ['socketio', function(socket) {
        var salutation = 'Hello';
        this.setSalutation = function(s) {
            salutation = s;
        }

        function Greeter(a) {
            this.salutation = salutation;
            socket._emit('hello')

            this.greet = function() {
                return salutation + ' ' + a;
            }
        }

        this.$get = function(version) {
            return new Greeter(version);
        };
    }]);

导致

Error: [$injector:modulerr] Failed to instantiate module myApp due to:
[$injector:modulerr] Failed to instantiate module myApp.services due to: 
[$injector:unpr] Unknown provider: socketio

问题答案:

我认为是因为所有提供程序都在工厂之前实例化,因此提供程序仅需依赖其他提供程序。

作为一种解决方法,我正在使用创建模块的injector方法angular.module。一个可以完成您想完成的任务的插件:http
://plnkr.co/edit/g1M7BIKJkjSx55gAnuD2

注意,我也更改了工厂方法。现在,factory方法将使用connect方法返回对象。

var angularSocketIO = angular.module('socketioModule', ['ng']);
angularSocketIO.factory('socketio', [
    '$rootScope',
    function($rootScope) {
      return {
        connect: function(addr) {
          var socket = io.connect(addr, {
            'sync disconnect on unload': true
          });

          return socket;
        }
      };
    }]);


  angular.module('myApp.services', ['socketioModule'])
  .provider('greeter', [
    function() {
      var injector = angular.injector(['socketioModule']);
      var socketio = injector.get('socketio');

      var salutation = 'Hello';
      this.setSalutation = function(s) {
        salutation = s;
      }

      function Greeter(a) {
        this.salutation = salutation;
        socket._emit('hello');

        this.greet = function() {
          return salutation + ' ' + a;
        };
      }

      this.$get = function(version) {
        return new Greeter(version);
      };
    }
  ]);


  var myApp = angular.module('myApp', ["myApp.services"]);


 类似资料:
  • 问题内容: 我做错了什么? 根据文件,我应该能够注入到......但我得到一个错误- “未知供应商” http://jsfiddle.net/g26n3/ 实际上,我在这里有三个问题… 1)如何注入模块的配置。 2)如何向模块配置注入相同的提供程序()。 3)如果我将相同的提供程序注入到两个模块的配置中,它将是相同的提供程序实例,还是两个不同的实例? 谢谢! 问题答案: 您需要添加“ Provid

  • 问题内容: 我有一个和一个。 我想用的。 当我通过注射添加时: 我得到这个嵌套错误: [嵌套] 11592-2018-8-13 11:42:17 [ExceptionHandler] Nest无法解析PlayersService(+,?)的依赖项。请确保索引[1]的参数在当前上下文中可用。 这两个模块均导入。两种服务都在其模块中单独工作。 问题答案: 你要 导出 的是它提供的模块: 然后将导出 模

  • 问题内容: 什么是之间的差异,并在AngularJS? 问题答案: 从AngularJS邮件列表中,我得到了一个很棒的线程,它解释了服务,工厂,提供者及其注入用法。汇编答案: 语法: 结果:在将serviceName声明为可注入参数时 ,将为您提供函数实例。 换句话说 。 工厂名称 语法: 结果:在将factoryName声明为可注入参数时,将为您提供 通过调用传递给module.factory的

  • 我有以下3个模块在我的Spring启动应用程序: web(入口点/主应用程序类,用 坚持 服务 我现在正试图在模块中注入一个来自的服务。在这个服务中,我注入了来自模块的存储库。启动应用程序时,会出现以下错误: ImageService类: class: 这就是我在模块中将服务注入到我的类中的方式: 所以我在网上搜索,看到一些人有类似的问题。然后我得到了一个提示,我应该在我的应用程序类中将scanB

  • 问题内容: 当使用angular 1.2代替1.07时,以下代码不再有效,为什么? 问题出在喷射器配置部分(app.config)中: 如果我没记错的话,这个问题是从1.1.6开始的。 问题答案: 该问题是由于缺少ngRoute模块而引起的。从1.1.6版开始,它是一个单独的部分:

  • 问题内容: 我写了如下工厂 但是我一直收到这个错误 我搜索了该错误,但找不到任何解决方案。 碰巧我将声明更改为此 错误消失了! 在前一行或下一行之间有什么区别吗? 问题答案: 这称为 自动分号插入 return语句受自动分号插入(ASI)的影响。return关键字和允许的表达式之间没有行终止符。 因此,您必须在return前面插入,而 不要在下一行 插入 。 参考: https : //devel