angularjs服务函数返回对象

时间:2015-08-10 14:42:27

标签: angularjs

当我使用服务函数在angularjs中定义服务时,我可以返回如下代码的对象

angular.module('myApp').service('mySerivce',function(){
    return {
        add: function(){};
    };
});

我找不到任何关于这种编程风格的文档。

3 个答案:

答案 0 :(得分:2)

确保您了解syntax of factory and service

factory

angular.module('myApp').factory('myFactory',function(){
    return {
        add: function(){};
    };
});

service

angular.module('myApp').service('myService',function(){
    this.add = function () {};
});

答案 1 :(得分:0)

我建议您阅读以下Angular样式指南。

https://github.com/johnpapa/angular-styleguide

在此处添加更多详细信息(摘自样式指南)

  

使用new关键字实例化服务,将其用于公共方法和变量。由于这些与工厂非常相似,因此请使用工厂以保持一致性。

     

注意:所有Angular服务都是单例。这意味着每个进样器只有一个给定服务的实例。


    // service
    angular
       .module('app')
       .service('logger', logger);

    function logger() {
       this.logError = function(msg) {
          /* */
       };
    }
    // factory
    angular
       .module('app')
       .factory('logger', logger);

    function logger() {
       return {
          logError: function(msg) {
              /* */
          }
       };
    }

    // factory
    angular
       .module('app')
       .factory('logger', logger);

    function logger() {
       return {
          logError: function(msg) {
             /* */
          }
       };
    }

答案 2 :(得分:0)

在角度服务中是单例,这意味着该服务只有一个实例。在某些情况下,您需要唯一的对象实例。这就是工厂模式派上用场的地方。

https://en.wikipedia.org/wiki/Factory_method_pattern

在角度内,$resource工厂最容易看到这种模式。使用$ resource工厂,您可以请求资源的唯一实例。

在Angular服务中是类。它们是构造函数。但是只有一个实例被新建了。因此工厂允许您根据需要使用新实例。

// my service
function Foo(fooId) {

    this.id = fooId;
}

function fooFactory() {

    return function(id) {
        return new Foo(id);
    }
}
angular.module('app').factory('foo', fooFactory);

所以在上面,如果我们删除工厂并将Foo绑定到带有angular.module('app').service('foo', Foo)的DI容器 - 会发生什么? Foo的每个实例都具有相同的id。但是使用这个工厂,我们可以在创建实例时设置id。

那么为什么要使用工厂而不仅仅是自己新建实例?可测性。如果你在你的服务或控制器中新建你的类(是的,构造函数只是一个类,在某种意义上),那么你的代码是不可测试的。

你需要这个吗?可能不是很多。

您应该只使用服务。

function Bar($http, $timeout) {

    this.$http = $http;
    this.$timeout = $timeout;
}

Bar.prototype.doSomething = function(value) {

   return this.$http.get('/api/dosomthing', {value: value});
}

angular.module('app').service('bar', Bar);