У мене є послуга 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)не працюватиме з другої функції, і я можу це зрозуміти.
EDIT:
Насправді вся проблема була спричинена тим, що ви не можете відтворити лише на моєму прикладі. Я передав другу функцію як параметр зворотного виклику іншій функції в окремому контролері, і коли вона викликається, посилання на 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);
...
};
але обидва здаються брудними хаками.
Чи є в цьому випадку хороший спосіб викликати першу функцію з другої? Або я в першу чергу роблю щось зовсім не так, щоб мати таку послугу?
Я знайшов ці запитання з хорошими відповідями:
- Angularjs ділиться функціями всередині служби
- AngularJs викликають внутрішню службову функцію від self
але вони відрізняються від моєї проблеми, оскільки одна з них має окрему внутрішню функцію, яку слід було викликати, а інша використовує фабрику замість послуги.
РЕДАГУВАТИ:
Опублікувавши це, я відразу зрозумів, що можу зробити і таке:
var actualWork = function(param) {
...
}
this.publicFunction(param) {
actualWork(param);
};
this.anotherPublicFunction(param) {
actualWork(param);
...
};
що здається не таким поганим, як інші варіанти дотепер ... Чи є кращі підходи?
var ms = this;(що частіше пишуть якvar self = this;) "брудним хаком"?