ES6 服务 (AngularJS)
Services with ES6 (AngularJS)
我在使用 ES6 创建服务时访问 Angular 内置服务(例如 $http)时遇到问题。
例如,我正在创建一个 "ResultsFinder" 服务,它将执行 AJAX 调用,然后执行一些操作。
问题是我只能在构造函数上访问 $http(如果我将它作为参数传递),但不能在其他方法(例如 getResults)上访问。
查看此代码示例:
(() => {
'use strict';
class ResultsFinder {
constructor($http) {}
getResults() {
return 'ResultsFinder';
}
}
/**
* @ngdoc service
* @name itemManager.service:ResultsFinder
*
* @description
*
*/
angular
.module('itemManager')
.service('ResultsFinder', ResultsFinder);
}());
在 getResults 内部,我无权访问 $http。为了获得访问权限,我应该做一些我觉得不对的事情:
(() => {
'use strict';
class ResultsFinder {
constructor($http) {
this.$http = $http;
}
getResults() {
// Here I have access to this.$http
return 'ResultsFinder';
}
}
/**
* @ngdoc service
* @name itemManager.service:ResultsFinder
*
* @description
*
*/
angular
.module('itemManager')
.service('ResultsFinder', ResultsFinder);
}());
任何人都可以给我一些有关处理此问题的正确方法的建议吗?
您需要在 getResults
方法中使用 this.$http
。
(() => {
'use strict';
class ResultsFinder {
static $inject = ['$http'];
constructor($http) {
this.$http = $http;
}
getResults() {
return this.$http.get('/foo/bar/');
}
}
/**
* @ngdoc service
* @name itemManager.service:ResultsFinder
*
* @description
*
*/
angular
.module('itemManager')
.service('ResultsFinder', ResultsFinder);
}());
作为旁注,我在您的 class 中添加了静态 $inject
"annotation"。如果您不使用 ngAnnotate 之类的东西,这是最佳实践。它还可以更轻松地通过仅更改 $inject
值来更改实现。
如果您是 ES5 开发人员,考虑一下这在 ES5 中的外观可能会有所帮助
ResultsFinder.$inject = ['$http'];
var ResultsFinder = function($http) {
this.$http = $http;
}
ResultsFinder.prototype.getResults = function() {
return this.$http.get('/foo/bar/');
}
注意
既然你使用的是 ES6,那么应该使用 ES6 模块来组织你的代码。
您在 ES6 模块中定义并导出 angular-模块:
import {module} from 'angular';
export var itemManager = module('itemManager', []);
然后导入Angular模块
import {itemManager} from '../itemManager';
class ResultsFinder {
static $inject = ['$http'];
constructor($http) {
this.$http = $http;
}
getResults() {
return this.$http.get('/foo/bar/');
}
}
itemManager.service('ResultFinder', ResultFinder);
我在使用 ES6 创建服务时访问 Angular 内置服务(例如 $http)时遇到问题。
例如,我正在创建一个 "ResultsFinder" 服务,它将执行 AJAX 调用,然后执行一些操作。 问题是我只能在构造函数上访问 $http(如果我将它作为参数传递),但不能在其他方法(例如 getResults)上访问。
查看此代码示例:
(() => {
'use strict';
class ResultsFinder {
constructor($http) {}
getResults() {
return 'ResultsFinder';
}
}
/**
* @ngdoc service
* @name itemManager.service:ResultsFinder
*
* @description
*
*/
angular
.module('itemManager')
.service('ResultsFinder', ResultsFinder);
}());
在 getResults 内部,我无权访问 $http。为了获得访问权限,我应该做一些我觉得不对的事情:
(() => {
'use strict';
class ResultsFinder {
constructor($http) {
this.$http = $http;
}
getResults() {
// Here I have access to this.$http
return 'ResultsFinder';
}
}
/**
* @ngdoc service
* @name itemManager.service:ResultsFinder
*
* @description
*
*/
angular
.module('itemManager')
.service('ResultsFinder', ResultsFinder);
}());
任何人都可以给我一些有关处理此问题的正确方法的建议吗?
您需要在 getResults
方法中使用 this.$http
。
(() => {
'use strict';
class ResultsFinder {
static $inject = ['$http'];
constructor($http) {
this.$http = $http;
}
getResults() {
return this.$http.get('/foo/bar/');
}
}
/**
* @ngdoc service
* @name itemManager.service:ResultsFinder
*
* @description
*
*/
angular
.module('itemManager')
.service('ResultsFinder', ResultsFinder);
}());
作为旁注,我在您的 class 中添加了静态 $inject
"annotation"。如果您不使用 ngAnnotate 之类的东西,这是最佳实践。它还可以更轻松地通过仅更改 $inject
值来更改实现。
如果您是 ES5 开发人员,考虑一下这在 ES5 中的外观可能会有所帮助
ResultsFinder.$inject = ['$http'];
var ResultsFinder = function($http) {
this.$http = $http;
}
ResultsFinder.prototype.getResults = function() {
return this.$http.get('/foo/bar/');
}
注意
既然你使用的是 ES6,那么应该使用 ES6 模块来组织你的代码。
您在 ES6 模块中定义并导出 angular-模块:
import {module} from 'angular';
export var itemManager = module('itemManager', []);
然后导入Angular模块
import {itemManager} from '../itemManager';
class ResultsFinder {
static $inject = ['$http'];
constructor($http) {
this.$http = $http;
}
getResults() {
return this.$http.get('/foo/bar/');
}
}
itemManager.service('ResultFinder', ResultFinder);