如何在Angular中定义服务和工厂中的构造函数?

时间:2017-06-12 12:26:31

标签: angularjs

我对角度有点熟悉。还在学习过程中。使用ng版本1.4.8。所以我想知道如何在服务和工厂中定义构造函数。

这是一个示例服务。现在告诉我如何在服务或工厂中定义构造函数?

angular.module('myApp').service('helloService',function($timeout){
  this.sayHello=function(name){
    $timeout(function(){
      alert('Hello '+name);
    },2000);
  }
});

angular.module('myApp').controller('TestController',
  function(helloService){
  helloService.sayHello('AngularJS'); // Alerts Hello AngularJS
});

2 个答案:

答案 0 :(得分:5)

传递给.service的函数会被new调用,因此它基本上已经是构造函数。它是一个“构造函数”,它隐式返回一个对象,即单例:

angular.module('myApp').service('helloService',function($timeout){
  // This constructor function implicitly returns an object. It is called
  // only once by Angular to create a singleton.

  this.sayHello = function(name) {
    // etc
  }
});

为了说明,如果你将ES6类传递给.service(它有一个构造函数)而不是构造函数,那么在创建单例时会调用该构造函数:

class HelloService {
    constructor($timeout) {
        // Called once when the singleton is created
    }

     sayHello(name) {
         // etc
     }
}

angular.module('myApp').service('helloService', HelloService);

使用.factory类似,但不会使用new调用它。因此,在这种情况下使用的函数必须显式返回单个对象:

angular.module('myApp').factory('helloService',function($timeout){
  // This factory function explicitly returns an object. It is called
  // only once by Angular to create a singleton.

  return {
      sayHello: function(name) {
          // etc
      }
  };
});

编辑:如@Vladimir Zdenek所述,这些“构造函数”不能用于在外部配置单例。但是,我将这个问题解释为“我在哪里可以放置在创建单例时运行的代码?”。单身人士可能需要初始化数据,以便初始化可以在“构造函数”中进行。

答案 1 :(得分:3)

在单身人士方面,(可能在大多数情况下)不需要构造函数。要求这样的事情可能只是指向应用程序的糟糕架构设计。

也就是说,您可以使用提供商为您的服务/工厂提供全局配置。您可以在Official Documentation中找到有关提供商的更多信息。

如果您不需要单例并希望创建可重用的代码段,则可以使用称为工厂函数的(在JavaScript中)。您可以在下面看到此类功能的示例。

function MyFactory(myParams) {

    const Factory = {
        // Properties
        myProperty: myParams.myProperty,
        // Methods
        getMyProperty: getMyProperty
    };

    return Factory;

    function getMyProperty() {
        return Factory.myProperty;
    }

}

// usage
const myObj = MyFactory({ myProperty: 'Hello' });