AngularJS - Использование this в частной функции

0

В моем модуле Angular у меня есть такая услуга:

myApp.service( 'myService', function(){

    this.publicFunction1 = function(){
        ...
    };

    this.publicfunction2 = function(){
        ...
    };

    function privateFunction(){
        ...
    }
});

В какой-то момент мне нужно вызвать одну из "общедоступных" функций из частного, например:

function somePrivateFunc(){
    this.publicFunction1();
    ...
}

Но элемент "это" кажется не видимым внутри частной функции. Как я могу вызвать publicFunction1() внутри?

Вот обходной путь, но я хотел бы разобраться в ситуации. Может кто-нибудь объяснить мне, что здесь происходит? И есть ли лучший способ сделать это?

myApp.service( 'myService', function(){

    var service = this;

    this.publicFunction1 = function(){
        ...
    };

    this.publicfunction2 = function(){
        ...
    };

    function privateFunction(){
        service.publicFunction1();
        ...
    }
});
  • 1
    Определите переменную как var _this=this; в области обслуживания, затем используйте ссылку в закрытой функции, например _this.publicFunction1();
  • 0
    Прочитайте это stackoverflow.com/questions/34064666/…
Теги:

3 ответа

5
Лучший ответ

Храните ссылку на this переменную снаружи и ссылайтесь на нее так:

myApp.service('myService', function() {
    var self = this;
    this.publicFunction1 = function() {
        ...
    };

    this.publicfunction2 = function() {
        ...
    };

    function privateFunction() {
        ...
    }

    function somePrivateFunc() {
        self.publicFunction1();
        ...
    }
});

Поскольку публичная функция является частью службы, а контекст выполнения для углового обслуживания - this ключевое слово. Но поскольку частная функция (обычная функция javascript) не является частью службы, следовательно, эта функция не использует один и тот же контекст исполнения. Таким образом, для этой частной функции контекст выполнения - это не что иное, как глобальный объект window. Поэтому, если вы ссылаетесь на this частную функцию, вы получите объект window. Поэтому для вызова служебной функции из обычной функции javascript (private function) нам нужно сохранить ссылку на угловое значение this объекта.

Надеюсь, это ясно ваше сомнение.

  • 0
    Точно такой же ответ, я проголосовал за вас.
  • 0
    @LouisXIV Haha..thnx ..
Показать ещё 1 комментарий
3

Вы можете создать ссылку для этого в переменной, например:

myApp.service( 'myService', function(){
    var self = this; // creation of the variable here

    this.publicFunction1 = function(){
        ...
    };

    this.publicfunction2 = function(){
        ...
    };

    function privateFunction(){
        self.publicFunction1();
        ...
    }
});

EDIT: чтобы объяснить, почему это необходимо, Angular выполняется на основе инъекции зависимостей (читайте здесь: https://docs.angularjs.org/guide/di). Вы добавите "myService" в качестве зависимости в контроллере, например, и у вас будет доступ к объекту, созданному из определения "myService".

Затем вы сможете вызвать this.publicFunction1().

С другой стороны, если вы не добавите это, этот метод не будет существовать в вашем контроллере.

  • 0
    Просто разобрался, прежде чем читать твой пост. Но спасибо ! Не могли бы вы объяснить, почему это необходимо?
  • 0
    Хорошо, я попытался кратко объяснить смысл этого здесь, извините, мой английский немного заржавел.
0

Вне функции объявите переменную следующим образом:

var me = this;

Затем вы можете ссылаться на "внешнее" this изнутри функции.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню