$get
介绍
在 AngularJS 中,$get
是 provider
的一个方法,用于定义和返回服务的实例。当 AngularJS 需要创建这个服务时,就会调用 $get
方法,并且所有使用这个服务的地方都会共享这个实例(单例模式)。
基本用法
angular.module("myApp", [])
.provider("mathService", function () {
var factor = 1;
this.setFactor = function (value) {
factor = value;
};
this.$get = function () {
return {
multiply: function (num) {
return num * factor;
}
};
};
})
.config(function (mathServiceProvider) {
mathServiceProvider.setFactor(10);
})
.controller("MainController", function ($scope, mathService) {
$scope.result = mathService.multiply(5);
});
$get
的执行时机
- AngularJS 启动时,
config()
里的 provider
代码会执行,但 $get
还不会运行。
- 当某个地方第一次使用
mathService
,$get
里的代码才会执行,并返回服务实例。
- 后续调用
mathService
时,不会重复执行 $get
,而是直接复用之前创建的实例(单例模式)。
为什么要用 $get
?
- 允许在
config()
阶段修改服务的参数。
- 采用单例模式,保证全局只有一个实例,不会重复创建。
- 提供比
factory
和 service
更强的控制能力,例如可以动态返回不同的服务实例。
$get
vs factory
vs service
方法 |
适用场景 |
允许在 config() 配置 |
需要手动 return 对象 |
provider |
需要在 config() 里修改参数 |
是 |
是 |
factory |
普通服务 |
否 |
是 |
service |
面向对象风格 |
否 |
否(使用 this ) |
什么时候使用 $get
?
需求 |
适合方式 |
需要在 config() 阶段修改参数(如 API URL) |
provider (使用 $get 创建服务) |
普通的数据共享、工具类 |
factory 或 service |
需要 new 生成对象实例 |
service |
适用于 config()
配置的示例
angular.module("myApp", [])
.provider("apiService", function () {
var apiUrl = "https://default-api.com";
this.setApiUrl = function (url) {
apiUrl = url;
};
this.$get = function ($http) {
return {
getData: function () {
return $http.get(apiUrl);
}
};
};
})
.config(function (apiServiceProvider) {
apiServiceProvider.setApiUrl("https://my-custom-api.com");
})
.controller("MainController", function ($scope, apiService) {
apiService.getData().then(function (response) {
$scope.data = response.data;
});
});
总结
$get
主要用于 provider
里,告诉 AngularJS 如何创建这个服务。
- 如果需要在
config()
里先修改参数,再在 run()
里使用,必须用 provider
。
- 如果不需要在
config()
里改参数,直接用 factory
就行了,更简单。