Угловой 1 - передача HTTP-запроса через класс JavaScript. [Дубликат]

Я считаю, что Python 3.1 по умолчанию будет печатать их лучше, без изменения кода. Но это бесполезно, если вы используете какие-либо расширения, которые не были обновлены для работы с Python 3.1

2
задан alexk 16 December 2016 в 07:40
поделиться

3 ответа

Классы ES2015 (или transpiled classes) - это просто синтаксический сахар над прототипным наследованием. Это означает, что методы, которые вы определяете, помещаются в прототип «класса». Чтобы иметь доступ к зависимостям, введенным в конструкторе, вам нужно как-то сохранить их для последующей ссылки методом прототипа.

Обычно это делается путем помещения их в экземпляр:

function HomeController($http) {
  this.$http = $http;
}
HomeController.prototype.doMe = function() {
  this.$http.get('http://www.yahoo.com/');
};

В синтаксисе на основе класса это означает:

class HomeController {
  constructor($http) {
    this.$http = $http;
  }

  doMe() {
    this.$http.get('http://www.yahoo.com/');
  }
}

EDIT: если вы используете TypeScript, вы можете сохранить некоторый шаблонный шаблон, используя модификаторы доступа в аргументах конструктора. Например:

class HomeController {
  constructor(private $http) {}
}

... который является сокращением для:

class HomeController {
  private $http;

  contructor($http) {
    this.$http = $http;
  }
}

РЕДАКТИРОВАТЬ 2: Если вы хотите сделать ваш контроллер мини-дружественным, вы можете использовать один из вариантов, описанных здесь здесь (возможно, наряду с инструментом, подобным ngAnnotate ). Например, вы можете использовать метод «$inject Property Annotation:

ES5

HomeController.$inject = ['$http'];
function HomeController($http) {...}
HomeController.prototype.doMe = function() {...}

ES2015

class HomeController {
  constructor($http) {...}

  doMe() {...}
}
HomeController.$inject = ['$http'];

// OR

class HomeController {
  static get $inject() { return ['$http']; }
  constructor($http) {...}

  doMe() {...}
}

ТипScript

class HomeController {
  static $inject = ['$http'];
  constructor(private $http) {}

  doMe() {...}
}
3
ответ дан gkalpak 15 August 2018 в 21:10
поделиться
  • 1
    static $inject = ['$http'] также можно добавить. – estus 16 December 2016 в 10:46
  • 2
    Я не получил ваш комментарий @estus: где это можно добавить точно? – alexk 16 December 2016 в 11:25
  • 3
    @alexk В классе контроллера. Класс должен быть аннотирован для правильной оценки. – estus 16 December 2016 в 11:30
  • 4
    @estus Где именно? Как строка в конструкторе контроллера? – alexk 16 December 2016 в 11:48
  • 5
    @alexk: я обновил ответ, чтобы включить в него дополнительную информацию о «удобстве для минимизации». – gkalpak 16 December 2016 в 20:54

В конце я сделал:

controller: class {
    constructor($http, Restangular, $state) {
        Object.assign(this, {$http, Restangular, $state});
    }
    doMe() {
       // use this.$http, this.Restangular & this.$state freely here
    }
}
0
ответ дан alexk 15 August 2018 в 21:10
поделиться

Класс должен иметь явную $inject аннотацию для правильной оценки:

class HomeCtrl {
    static get $inject() {
        return ['$http'];
    }
    // or unstandardized shortcut:
    // static $inject = ['$http'];

    constructor($http) {
        this.$http = $http;
    }

    doMe() {
         this.$http...
    }
}
0
ответ дан estus 15 August 2018 в 21:10
поделиться
Другие вопросы по тегам:

Похожие вопросы: