78

我通过以下方式定义了一个 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);
  ...
};

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

4

11 回答 11

40

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

var myFunctions = 
{

    myFunc1: function(param) {

    },

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

}
return myFunctions;

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

于 2014-02-28T08:02:20.910 回答
33

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

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

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

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

于 2015-06-29T17:58:05.347 回答
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) {你现在在函数内的另一个函数中,这不再是服务而是窗口。

于 2013-11-18T16:22:02.913 回答
4

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

return {

    myFunc1: function(param) {

    },

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

}

因此,您可以使用 this 从外部访问它,也可以service.myFunc1从其内部功能访问它。

于 2013-11-07T18:33:37.177 回答
4

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

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

  this.anotherPublicFunction(param) {
    that.publicFunction(param);
  };
});
于 2015-10-27T16:55:04.120 回答
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);**
    ...
  };
});
于 2017-07-20T21:18:51.390 回答
0
angular.module('myService').service('myService', function() {
    return {
      myFunc2: function(param) {
        return foo + myFunc1(param);
      }
    };
    function myFunc1(param){
        ...
    };
});
于 2016-11-24T06:58:05.337 回答
0

这就是我实现的方式:

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

})

于 2016-06-04T12:18:25.173 回答
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;

 }
 ]);`
于 2016-07-05T21:02:58.027 回答
-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;
});    
于 2017-05-05T15:56:50.577 回答
-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;
    }
}
于 2017-03-15T02:29:09.603 回答