Angularjs service typeerror undefined is not a function

Angularjs service typerror undefined is not a function

我在 coffeescript 中有这样的服务:

App.service 'CalculateService', ->
  @Calculate = (student) ->
    if student.type == 'MatureStudent'
      student.age + 10
    else
      student.age + 5

JS版本

App.service('CalculateService', function() {
  return this.Calculate = function(student) {
    if (student.type === 'MatureStudent') {
      return student.age + 10;
    } else {
      return student.age + 5;
    }
  };
});

像这样的控制器:

App.controller 'MarksCtrl', ($scope, $filter, CalculateService, lecture) ->

**create array**
$scope.students = []
angular.forEach $scope.lecture.students, (student) ->
    ......
  $scope.students.push(student)

**save array**
$scope.saveStudents = ->
    angular.forEach $scope.students, (student) ->
        student.points = CalculateService.Calculate(student)

JS版本

App.controller('MarksCtrl', function($scope, $filter, CalculateService, lecture) {
  $scope.students = [];
  angular.forEach($scope.lecture.students, function(student) {
    return $scope.students.push(student);
  });
  return $scope.saveStudents = function() {
    return angular.forEach($scope.students, function(student) {
      return student.points = CalculateService.Calculate(student);
    });
  };
});

当我调用 CalculateService.Calculate 时,我一直收到 "Typeerror undefined is not a function",但我不知道为什么。

我已经试过了并且有效:

$scope.saveStudents = ->
  angular.forEach $scope.students, (student) ->
    student.points = 2

所以只有当我调用服务时才会出现问题。知道我该怎么做吗?

看起来您正在 return 将函数本身作为服务。相反,只是不 return 函数,注入器更新服务只是将方法附加到它的实例,return 什么都没有。在您的原始情况下,您必须将其调用为 CalculateService(student)

尝试:

App.service 'CalculateService', ->

  @Calculate = (student) ->
    if student.type == 'MatureStudent'
      student.age + 10
    else
      student.age + 5

  return

我没有使用过 coffeescript,我用这个 transpiler 来弄清楚你的服务定义到底是什么。在出现此类疑问时,请对服务进行控制台日志记录以查看它实际输出的内容(在您的情况下,您应该看到函数本身)。

考虑到CoffeeScript自动returns最后一行代码,有必要在服务的底部放置一个return语句

app.service 'CalculateService', ->
  @Calculate = (student) ->
    if student.type == 'MatureStudent'
      student.age + 10 
    else
      student.age + 5  

return

Plunkr