这是一个示例服务。现在告诉我如何在服务或工厂中定义构造函数?
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
});
答案 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' });