从同一服务调用AngularJS服务中的函数?

MJV*_*MJV 75 angularjs

我有一个以下面的方式定义的AngularJS服务

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

  this.anotherPublicFunction(param) {
    // how to call publicFunction(param)?
    ...
  };
});    
Run Code Online (Sandbox Code Playgroud)

我想从服务外部(工作正常myService.publicFunction(xxx))和同一服务中的另一个函数调用第一个函数,即anotherPublicFunction.既不是一个this.publicFunction(param)myService.publicFunction(param)将不会从第二个函数中工作,我可以理解.


编辑:
实际上整个问题是由你无法单独复制的东西引起的.我将第二个函数作为回调参数传递给另一个控制器中的另一个函数,当它被调用时,引用this不起作用.

例如

anotherService.someCall('a', 123, myService.anotherPublicFunction);
Run Code Online (Sandbox Code Playgroud)

内部失败,anotherPublicFunction因为this无法解决.

我写了一个Plunker来显示问题: http ://plnkr.co/edit/rrRs9xnZTNInDVdapiqF?p = info

(我仍然会留下这个问题以防万一.)


我知道我可以通过使用对服务的引用或类似的第一个函数来解决问题

var ms = this;
this.anotherPublicFunction(param) {
  ms.publicFunction(param);
  ...
};
Run Code Online (Sandbox Code Playgroud)

或这个

var pf = this.publicFunction;
this.anotherPublicFunction(param) {
  pf(param);
  ...
};
Run Code Online (Sandbox Code Playgroud)

但两者看起来都很脏.

在这种情况下,有没有一种好方法可以从第二个函数调用第一个函数?或者我首先要做一些完全错误的事情来获得这样的服务?

我发现这些问题的答案很好:

但它们与我的问题不同,因为其中一个有一个单独的内部函数被调用,另一个是使用工厂而不是服务.

编辑:

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

var actualWork = function(param) {
  ...
}

this.publicFunction(param) {
  actualWork(param);
};

this.anotherPublicFunction(param) {
  actualWork(param);
  ...
};
Run Code Online (Sandbox Code Playgroud)

到目前为止,这似乎没有其他选项那么糟糕......有更好的方法吗?

Ala*_*med 40

我认为最好的方法是这样:

var myFunctions = 
{

    myFunc1: function(param) {

    },

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

}
return myFunctions;
Run Code Online (Sandbox Code Playgroud)

因为我认为如果你使用,它可能会与你使用该服务的范围发生冲突.


小智 32

我在自己的角度编码中遇到了这个问题,并选择使用这种形式的解决方案:

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

  myService.anotherPublicFunction(param) {
    myService.publicFunction(param);
    ...
  };
});
Run Code Online (Sandbox Code Playgroud)

我更喜欢这种方法,因为在我的代码中我使用publicFunction并在另一个PublicFunction内部循环遍历几个需要在进程中调用publicFunction的params.


Sle*_*nee 7

听起来不错但是当你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 

            }       
        }

}
Run Code Online (Sandbox Code Playgroud)

因为function(v) {你现在在函数中的另一个函数,这不再是服务而是窗口.


ang*_*ord 4

您可以只从服务中返回一个对象,例如

return {

    myFunc1: function(param) {

    },

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

}
Run Code Online (Sandbox Code Playgroud)

因此,您可以使用 this 从外部访问它,service.myFunc1也可以使用它的内部函数访问它。