创建一个具有扩展点的AngularJS服务
首先
这篇文章是关于“关于Angular Service的创建方法,用户可以更改设置”的。
假设存在以下AngularJS服务
var module = angular.module('myModule', []);
module.factory('myService', function(){
var message = 'Hello, world';
return {
hello: function(){
return message;
}
};
});
如果注入如下,就可以使用hello()(没有任何乐趣)的Service。
var app = angular.module('myApp', ['myModule']);
app.controller('MainCtrl', ['$scope', 'myService', function($scope, myService){
$scope.message = myService.hello();
}]);
在这里,假设希望能够根据应用程序的模块来设置hello()函数返回的消息。
使用服务提供商。
如果想要将模块的服务设置为可由使用者配置的服务,则可以使用$provide.provider。
也许有人会问,那是什么鬼东西呢?其实跟之前的代码中的factory稍微进行了一些修改而已。
var module = angular.module('myModule', []);
module.provider('myService', function(){
var opt = {message: 'Hello, world'};
this.configure = function(options){
opt = angular.extend(opt, options);
};
this.$get = function(){
return {
hello: function(){
return opt.message;
}
};
};
});
关键是使用了供应商的地方以及这个附近。
供应商的使用方法主要有以下几种:
provider はサービスプロバイダのコンストラクタを引数としてセットする.
サービスプロバイダのコンストラクタは、 $get メソッドを実装しなくてはならない(こいつが無い場合、Angularがエラーを吐く).
$get メソッドは関数であり、AngularのDI($inject)経由でインジェクションされる際に呼び出される関数を実装する(factory(…) でセットしていた関数と同様の位置づけ)
在Angular的服务注册中,module的provider是最基本的函数。
$provide.factory、$provide.value和$provide.service只是$provide.provider的包装。
那么,使用方可以通过以下方式实现,关键点就是将config[“(服务名)+Provider”]设置为模块中创建的服务提供者的构造函数,从而能够访问它。
var app = angular.module('myApp', ['myModule']);
app.config(['myServiceProvider', function(myServiceProvider){
myServiceProvider.configure({
message: 'My name is Quramy!'
});
}]);
app.controller('MainCtrl', ['$scope', 'myService', function($scope, myService){
$scope.message = myService.hello();
}]);
在AngularJS的核心中,通过服务提供者,为用户提供在服务中进行设置的接口的模式很多,你可能也在下面等地方见过。
-
- Ajax($http) と $httpProvider.interceptor
ngRoute における $routeProvider.when
etc…
补充——豆知识
-
- サービスプロバイダにアクセス可能なのは、 module.config のみである.
AnguarJSのアプリケーションが開始されてからは、サービスプロバイダにアクセスすることは出来ない.
逆に、アプリケーションを開始してからのServiceの挙動変更を許したいのであれば、module.value と module.run の組み合わせを考慮した方がよい.
module.config には、サービスプロバイダと module.constant で定義した定数のみがインジェクション可能.
$injector と $provide は例外的にインジェクション可能.
Service自体のインスタンス生成が実行されていないタイミングで、module.config が走る、という意味.
module.config の設定は、module._invokeQueue に登録されていき、この順序に従って実行される.
(やる価値があるかは別として)`angular.module(‘ng’)._invokeQueueをイジると、AngularJS本体の組み込みモジュールのプロバイダ登録より早いタイミングで処理を挟み込むことも出来る.
只需要一个选项
请参考以下内容
- https://docs.angularjs.org/guide/providers#providers_provider-recipe