在同一个服务中调用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)都不能工作,我可以理解这一点。


编辑:
其实整个问题都是由我个人的例子无法重现的。 我将第二个函数作为callbackparameter passing给另一个控制器中的另一个函数,并且在调用该函数时,对此的引用不起作用。

例如

 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共享服务内部的function
  • AngularJs从自己调用一个内部服务函数

但是它们与我的问题有所不同,因为其中一个具有独立的内部function,而另一个是使用工厂而不是服务。

编辑:

发布后,我立即意识到我也可以这样做:

 var actualWork = function(param) { ... } this.publicFunction(param) { actualWork(param); }; this.anotherPublicFunction(param) { actualWork(param); ... }; 

这看起来不像其他选项那么糟糕…有没有更好的方法?

我认为最好的办法就是这样做:

 var myFunctions = { myFunc1: function(param) { }, myFunc2: function(param) { return foo + myFunctions.myFunc1(param)// do some stuff with the first function } } return myFunctions; 

因为我认为如果你使用这个 ,它可能与你使用服务的范围发生冲突。

我在自己的angular码中遇到了这个问题,并select使用这种forms的解决scheme:

 angular.module('myService').service('myService', function() { var myService = this; myService.publicFunction(param) { ... }; myService.anotherPublicFunction(param) { myService.publicFunction(param); ... }; }); 

我更喜欢这种方法,因为在我的代码中,我使用publicFunction和anotherPublicFunction内部循环了几个参数,需要调用publicFunction作为过程的一部分。

听起来不错,但是当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) {你现在在另一个函数内的function,这不再是服务,但窗口。

你可以从你的服务中返回一个对象

 return { myFunc1: function(param) { }, myFunc2: function(param) { return foo + this.myFunc1(param)// do some stuff with the first function } } 

所以你用service.myFunc1从外部访问它,并从内部的函数内部访问它。

您可以将“this”设置为variables

 angular.module('myService').service('myService', function() { var that = this; this.publicFunction(param) { ... }; this.anotherPublicFunction(param) { that.publicFunction(param); }; }); 

这是我如何实现:

 .service('testSvc', function () { return { f1: function (v1) { alert('f1 > v1=' + v1); }, f2: function (v2) { alert('f2 > v2=' + v2); this.f1('az'); //use 'this' } } 

})

下面的解决scheme为我工作: –

  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; } ]);` 
 angular.module('myService').service('myService', function() { return { myFunc2: function(param) { return foo + myFunc1(param); } }; function myFunc1(param){ ... }; }); 

那么,只需在服务中使用局部variables为您的服务函数创build两个指针/函数variables,并使用它们在同一服务中调用服务函数:

*

 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);** ... }; }); 

最好和最简单的方法是:

 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; } } 

如果您想使用工厂声明而不是服务,您可以: –

 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; });