У меня есть функция 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);
...
};
что пока не так плохо, как другие варианты до сих пор... Есть ли лучшие подходы?