В моем модуле 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();
...
}
});
Храните ссылку на 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
объекта.
Надеюсь, это ясно ваше сомнение.
Вы можете создать ссылку для этого в переменной, например:
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().
С другой стороны, если вы не добавите это, этот метод не будет существовать в вашем контроллере.
Вне функции объявите переменную следующим образом:
var me = this;
Затем вы можете ссылаться на "внешнее" this
изнутри функции.
var _this=this;
в области обслуживания, затем используйте ссылку в закрытой функции, например_this.publicFunction1();