javascript - ES6 (AngularJS) 服务

标签 javascript angularjs web-services ecmascript-6 angular-services

在使用 ES6 创建服务时,我在访问 $http 等 Angular 内置服务时遇到问题。

例如,我正在创建一个“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);
}());

作为旁注,我向您的类添加了一个静态$inject“注释”。如果您不使用 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);

关于javascript - ES6 (AngularJS) 服务,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29646738/

相关文章:

c# - Web 服务请求调用 SOAP 请求缺少空参数

javascript - 在多个选择中上下移动元素不起作用

javascript - AngularJS 中 && 的替代方案

php - 使用 Controller 下载 Laravel Excel

javascript - 你可以使用<c :otherwise> with <c:if> or only with <c:when>?

ios - Web 服务调用返回 SIGABRT

java - 通过 Java 使用来自 http ://www. webservicex.net 的 Web 服务

javascript - 在 JavaScript 中从两个数组生成对象数组

javascript - 在 Angular-chart.js 中动态创建的 Canvas 上创建图表

javascript - 如何在angularJS中将自动完成下拉列表作为网格?