AngularJS - каковы основные отличия в разных способах объявления услуги в angular?

Я работаю над приложениями angularJS, и я стараюсь придерживаться самых эффективных и широко признанных стилей разработки в AngularJs. В настоящее время я использую этот способ объявления своих сервисов следующим образом:

app.factory('MyService', function() {
  /* ... */
  function doSomething(){
     console.log('I just did something');

  }

  function iAmNotVisible(){
      console.log('I am not accessible from the outside');
  }
  /* ... */

  return{
     doSomething: doSomething
  };
});

Однако есть множество примеров, и я не совсем уверен, какой стиль дизайна следует соблюдать. Может ли кто-нибудь с обширными знаниями об услугах объяснить причину, почему определенный стиль более уместен, чем другой?

Являюсь ли я чем-то полезным, кроме ограничения доступа к определенным функциям в моем сервисе?

Ответ 1

Я бы предложил вам разместить ваши factory или service, как в angular -seed app, за исключением того, что приложение досадно использует только value в шаблоне services.js. Однако вы можете адаптировать макет, который они используют для контроллеров, директив и фильтров.

'use strict';

/* Filters */

angular.module('myApp.filters', []).
  filter('interpolate', ['version', function(version) {
    return function(text) {
      return String(text).replace(/\%VERSION\%/mg, version);
    }
  }]);

Что означает для службы, которую вы бы сделали:

'use strict';

/* Services */

angular.module('myApp.filters', []).
  service('myservice', ['provider1', 'provider2', function(provider1, provider2) {
      this.foo = function() { 
          return 'foo'; 
      };
  }]).
  factory('myfactoryprovider', ['myservice', function(myservice) {
       return "whatever";
  }]);

У этого есть больше шаблона, чем вам абсолютно необходимо, но он безопасен и защищает ваши пространства имен.

Чем больше вам нужно, тем лучше решать, какие из const, value, factory или service наиболее подходят. Используйте service, если вы хотите создать один объект: он вызывается как конструктор, поэтому вы просто назначаете любые методы this, и все будет иметь один и тот же объект. Используйте factory, если вы хотите получить полный контроль над тем, создан или нет объект, хотя он все еще вызывается только один раз. Используйте value, чтобы вернуть простое значение, используйте const для значений, которые вы можете использовать в config.

Ответ 2

Я не считаю, что есть принятый стандарт, но я сам следую этому соглашению:

var myServiceFn = function (rootScope, http) { ... };
...
app.factory('MyService', ['$rootScope', '$http', myServiceFn]);

Мне кажется, что это чище, чем определение функции inline, а также позволяет правильно вставлять, если я когда-либо решаю минимизировать свои файлы. (см. http://docs.angularjs.org/tutorial/step_05).

Ответ 3

В качестве примера я определял службы в таких модулях:

angular.module('userModule', [])
  .service('userService', function() {
    this.user = null;

    this.getUser = function() {
      return this.user;
    };

    this.userIsNull = function() {
      return (this.user === null);
    };

    this.signout = function() {
      this.user = null;
    };
  })

Я думаю, что более понятно использовать .service, а не .factory?