在同一模块中多次声明AngularJS服务

时间:2016-10-26 09:31:44

标签: javascript angularjs

我正在使用AngularJS 1.x,我可以在同一个模块中多次定义相同的服务。在以下代码段中,我在模块nameService中定义服务myApp 2次:

(function() {
  'use strict';

  angular
    .module('myApp', [])
    .controller('MainController', MainController)
    .factory('nameService', nameService1)
    .factory('nameService', nameService2);

  MainController.$inject = ['nameService'];

  function MainController(nameService) {
    var vm = this;

    vm.message = nameService.getName();
  }

  function nameService1() {
    return {
      getName: getName
    };

    function getName() {
      return 'First Definition';
    }
  }

  function nameService2() {
    return {
      getName: getName
    };

    function getName() {
      return 'Second Definition';
    }
  }
})();

在运行时,AngularJS将使用服务的第二个实现返回的值:" Second Definition"。请查看this Plunker example

因此,根据经验,AngularJS似乎始终使用服务的最新定义,而忽略了之前的定义。

我的问题是:是否有描述此行为的官方文档?

4 个答案:

答案 0 :(得分:1)

在这里,您将覆盖工厂/服务的定义。工厂/服务是单身,即只有一个实例。

factory('name', constructing_function)

你的情况,

factory('nameService', nameService1)//Here object { getName: getName } will be assigned to nameService instance.

factory('nameService', nameService2)//Here object { getName: getName } (#2nd definition) will be assigned to nameService instance. i.e. nameservice instance referring to (#2nd definition).

答案 1 :(得分:1)

这就是JavaScript的工作方式:

function Vinoth(){console.log("Printing first")}

function Something(){console.log("Printing Something")}

function Vinoth(){console.log("Printing Second")}

当您执行console.log(Vinoth());时,它将始终打印Second一个。到你的第二部分:

  angular
    .module('myApp', [])
    .controller('MainController', MainController)
    .factory('nameService', nameService1)
    .factory('nameService', nameService2);

AngularJS服务本质上是singleton,因此它将成为整个应用程序生命周期中的一个实例。您的nameService1 and nameService2指向同一nameService instance。从技术上讲,它nameService保持nameService2,因为它先于吊装。

答案 2 :(得分:0)

此功能没有官方文档。

如果您愿意,可以请求angularjs的维护者为此功能添加文档。

答案 3 :(得分:0)

不需要定义服务(Inject)两次。更好的解决方案是,您可以定义一次服务。并使用像,

angular.module('myApp', []).controller('MainController', MainController) .factory('nameService', nameService1)

在这里,我们可以使用像

这样的服务
var nameService2 = angular.copy(nameService);

这是最佳做法。