Вызов функции в службе AngularJS из той же службы?
У меня есть функция AngularJS, определенная следующим образом.
angular.module('myService').service('myService', function() {
this.publicFunction(param) {
...
};
this.anotherPublicFunction(param) {
// how to call publicFunction(param)?
...
};
});
и я хотел бы назвать первую функцию как извне службы (которая отлично работает с помощью myService.publicFunction(xxx)
), так и из другой функции в той же службе, то есть anotherPublicFunction
. Ни один из this.publicFunction(param)
или myService.publicFunction(param)
не будет работать из второй функции, и я могу это понять.
РЕДАКТИРОВАТЬ:
На самом деле вся проблема была вызвана тем, что вы не можете воспроизвести с моим примером. Я передал вторую функцию в качестве параметра обратного вызова в другую функцию в отдельном контроллере, и когда она вызывается, ссылка на this
не работает.
например.
anotherService.someCall('a', 123, myService.anotherPublicFunction);
выходит из строя внутри anotherPublicFunction
, потому что this
не может быть разрешен.
Я написал Plunker, чтобы показать проблему:
http://plnkr.co/edit/rrRs9xnZTNInDVdapiqF?p=info
(Я все равно оставлю вопрос здесь, если это поможет кому-то другому.)
Я знаю, что смогу обойти проблему, используя ссылку на службу или первую функцию, подобную этой
var ms = this;
this.anotherPublicFunction(param) {
ms.publicFunction(param);
...
};
или
var pf = this.publicFunction;
this.anotherPublicFunction(param) {
pf(param);
...
};
но оба выглядят как грязные хаки.
Есть ли хороший способ вызвать первую функцию из второго в этом случае? Или я делаю что-то совершенно неправильное, в первую очередь, чтобы иметь такой сервис?
Я нашел эти вопросы с хорошими ответами:
но они отличаются от моей проблемы, поскольку одна из них имеет отдельную внутреннюю функцию, которая должна была вызываться, а другая использовала factory вместо службы.
EDIT:
После публикации этого я сразу понял, что могу это сделать:
var actualWork = function(param) {
...
}
this.publicFunction(param) {
actualWork(param);
};
this.anotherPublicFunction(param) {
actualWork(param);
...
};
что пока не так плохо, как другие варианты до сих пор... Есть ли лучшие подходы?
Ответы
Ответ 1
Я думаю, что лучший способ - это:
var myFunctions =
{
myFunc1: function(param) {
},
myFunc2: function(param) {
return foo + myFunctions.myFunc1(param)// do some stuff with the first function
}
}
return myFunctions;
потому что я думаю, что если вы используете это, это может привести к конфликту с областью использования вами службы.
Ответ 2
Я столкнулся с этой проблемой в своем собственном коде angular и решил использовать эту форму решения:
angular.module('myService').service('myService', function() {
var myService = this;
myService.publicFunction(param) {
...
};
myService.anotherPublicFunction(param) {
myService.publicFunction(param);
...
};
});
Я предпочел этот подход, потому что в моем коде я использую publicFunction, а внутри anotherPublicFunction я перебираю несколько параметров, которые нужно вызвать publicFunction как часть процесса.
Ответ 3
Звучит неплохо, но что вы делаете, когда this
больше не =
сервис?
Это в следующем примере:
return {
myFunc1: function(param) {
},
myFunc2: function(param) {
scope.$watchCollection(param,function(v) {
return foo + this.myFunc1(param)// do some stuff with the first function
}
}
}
Из-за function(v) {
теперь вы находитесь в другой функции внутри функции, и это больше не служба, а окно.
Ответ 4
Вы можете просто вернуть объект из своего сервиса, например
return {
myFunc1: function(param) {
},
myFunc2: function(param) {
return foo + this.myFunc1(param)// do some stuff with the first function
}
}
Таким образом, вы получаете доступ к нему снаружи с помощью service.myFunc1
и изнутри своих внутренних функций с этим.
Ответ 5
Вы можете установить 'this' как переменную
angular.module('myService').service('myService', function() {
var that = this;
this.publicFunction(param) {
...
};
this.anotherPublicFunction(param) {
that.publicFunction(param);
};
});
Ответ 6
вот как я реализовал:
.service('testSvc', function () {
return {
f1: function (v1) {
alert('f1 > v1=' + v1);
},
f2: function (v2) {
alert('f2 > v2=' + v2);
this.f1('az'); //use 'this'
}
}
})
Ответ 7
Ниже мне помогло: -
angular.module('myService').service('myService', function() {
var self= {
this.publicFunction(param) {
...
};
this.anotherPublicFunction(param) {
// You can call the publicfunction like below
self.publicFunction(param);
...
};
return self;
}
]);`
Ответ 8
angular.module('myService').service('myService', function() {
return {
myFunc2: function(param) {
return foo + myFunc1(param);
}
};
function myFunc1(param){
...
};
});
Ответ 9
Ну, просто создайте еще две указатели/функциональные переменные для ваших сервисных функций с локальными переменными в сервисе и используйте их для вызова сервисных функций из одной службы:
*
angular.module('myService').service('myService', function() {
**var ref1, ref2;**
this.publicFunction = **ref1** = function(param) {
...
};
this.anotherPublicFunction = **ref2** = function(param) {
// how to call publicFunction(param)?
**ref1(argument);**
...
};
});
Ответ 10
Лучший и простой способ вызова:
myapp.service("SomeService", function ($http) {
this.func1 = function (params) {
// Some thing the service returns
return something;
}
this.func2 = function (params) {
// Some thing the service returns
var resp = this.func1(params);
return something;
}
}
Ответ 11
Если вы хотите использовать объявление factory вместо службы, вы можете: -
angular.module('myService').factory('myService', function() {
var myService = {};
myService.publicFunction = function(param) {
...
};
myService.anotherPublicFunction = function(param) {
// call publicFunction(param) like so
myService.publicFunction(param);
};
return myService;
});