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

时间:2013-11-07 17:30:35

标签: 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)中的任何一个都不会在第二个函数中起作用,我可以理解。


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

E.g。

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

到目前为止看起来并不像其他选项那么糟糕......有更好的方法吗?

11 个答案:

答案 0 :(得分:40)

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

var myFunctions = 
{

    myFunc1: function(param) {

    },

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

}
return myFunctions;

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

答案 1 :(得分:32)

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

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

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

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

答案 2 :(得分: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 

            }       
        }

}

由于function(v) {你现在处于函数中的另一个函数中,这不再是服务而是窗口。

答案 3 :(得分:4)

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

return {

    myFunc1: function(param) {

    },

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

}

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

答案 4 :(得分:4)

您可以将'this'设置为变量

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

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

答案 5 :(得分: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);**
    ...
  };
});

答案 6 :(得分:0)

这就是我实施的方式:

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

})

答案 7 :(得分: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;

 }
 ]);`

答案 8 :(得分:0)

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

答案 9 :(得分:-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;
    }
}

答案 10 :(得分:-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;
});