Declare o serviço AngularJS várias vezes no mesmo módulo

9

Estou trabalhando com o AngularJS 1.xe posso definir o mesmo serviço várias vezes no mesmo módulo. No snippet de código a seguir, estou definindo o serviço nameService 2 vezes no módulo myApp :

(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';
    }
  }
})();

Em tempo de execução, o AngularJS usará o valor retornado pela segunda implementação do serviço: "Segunda Definição". Por favor, verifique o este exemplo Plunker .

Então, empiricamente, o AngularJS parece usar sempre a última definição de um serviço, ignorando os anteriores.

A minha pergunta é: existe alguma documentação oficial que descreva este comportamento?

    
por Andrea 26.10.2016 в 11:31
fonte

4 respostas

1

Aqui, você está sobrescrevendo a definição de fábrica / serviço. factory / service é singleton, ou seja, haverá apenas uma instância dele.

factory('name', constructing_function)

Seu caso,

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).
    
por ram1993 26.10.2016 / 11:48
fonte
1

É assim que funciona o JavaScript:

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

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

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

Quando você faz um console.log(Vinoth()); , sempre imprime o Second one. Para a sua segunda parte:

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

Os serviços AngularJS são singleton por natureza, portanto, será uma instância do ciclo de vida do seu aplicativo. Seu nameService1 and nameService2 está apontando para o mesmo nameService instance . Tecnicamente, nameService detém nameService2 , conforme precede de acordo com o içamento.

    
por Thalaivar 26.10.2016 / 12:06
fonte
0

Não, não há documentação oficial para esta função.

Se você quiser, pode pedir aos mantenedores do angularjs para adicionar documentação para este recurso.

    
por Bob Brinks 26.10.2016 / 15:11
fonte
0

Não é necessário definir o serviço (Injectar) duas vezes. Melhor solução é, você define o serviço uma vez. E use como,

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

Dentro disso, podemos usar esse serviço como

var nameService2 = angular.copy(nameService);

Isto é para melhor prática.

    
por Satzz 28.10.2017 / 16:11
fonte