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


77

我有以下方式定义的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);
  ...
};

但两者似乎都是肮脏的骇客。

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

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

但是它们与我的问题不同,因为它们之一具有要调用的单独的内部函数,而另一个则使用工厂而不是服务。

编辑:

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

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

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

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

到目前为止,这似乎还不如其他选择那么糟糕。是否有更好的方法?


1
您为什么称呼var ms = this;(通常写为var self = this;)“肮脏的骇客”?
米哈伊尔·巴瑟

这只是个人喜好,并取决于我的背景(尤其是Java语言)。this在同一个作用域中对另一个变量使用新的“指针”感觉很奇怪……但是这this是一个特殊的参考,JavaScript具有这种词法闭包,所以这是我编写JS代码时应该接受并接受的东西之一。当在罗马等时
MJV 2015年

Answers:


40

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

var myFunctions = 
{

    myFunc1: function(param) {

    },

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

}
return myFunctions;

因为我认为如果您使用this,它可能会与您使用服务的范围发生冲突。


OP的最终编辑是可行的。只需声明var foo = function(){...}并像bar = function(){... foo()...}这样在bar中调用foo()
wsgeorge 2015年

这是一项服务,您使用“ this”
bokkie 17-4-26

33

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

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

  myService.anotherPublicFunction(param) {
    myService.publicFunction(param);
    ...
  };
});

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


1
很简单的。优秀!
Umar

8

听起来不错,但是当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它的内部功能,也可以从内部使用它的内部功能。


这次真是万分感谢。当我在代码中然后在Plunker中进行尝试时,我意识到最初的问题只是其他问题的副作用。看来我的“问题”代码实际上按照我在问题中提出的方式起作用。
MJV

4

您可以将“ this”设置为变量

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

  this.anotherPublicFunction(param) {
    that.publicFunction(param);
  };
});

1

好吧,只需为服务函数创建两个带有服务中局​​部变量的指针/函数变量,然后使用它们从同一服务中调用服务函数:

*

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

0

这就是我的实现方式:

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

})


0

以下解决方案为我工作:-

 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;

 }
 ]);`

0
angular.module('myService').service('myService', function() {
    return {
      myFunc2: function(param) {
        return foo + myFunc1(param);
      }
    };
    function myFunc1(param){
        ...
    };
});

-1

最好和最简单的呼叫方式是:

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

-1

如果要使用工厂声明而不是服务,则可以:

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;
});    
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.