无法从控制器angularjs访问服务

时间:2017-02-23 09:45:35

标签: javascript angularjs

我正在开展一个角度项目,我正在为旧项目添加新功能 我正在尝试使用我的控制器注册服务,但是在我的控制器无法找到服务中的功能时出现错误。

以下是我的控制器的定义方式(我知道这不是标准方式,但我必须遵循这一点,因为整个应用程序都有。)

angular.module("test").controller("listCtrl", listCtrl);
listCtrl.$inject = ["$scope", "$state", "$timeout", "listService", "$rootScope"];

function listCtrl($scope, $state, $timeout, listService, $rootScope ) {
  this.$scope= $scope;

  $scope.service=listService;
  //some other definitions

  $scope.items = $scope.service.getPage(%function_ARGUMENTS%);

}

以下是服务的定义方式:

angular.module("test").service("listService", listService);
listService.$inject = ['$state', '$rootScope'];

function listService($state, $rootScope) {
   function getPage(%function_ARGUMENTS%) {
     //getPage function definition goes here
   }
}  

现在,出于某种原因,我收到错误:

  

无法读取未定义的属性'getPage'

我无法弄清楚可能导致这种情况的原因 问题$scope是如何定义的?如果是,那么正确的方法是什么,假设this.$scope=$scope无法修改。

编辑:修正了问题中的复数拼写错误。我的程序中没有那个拼写错误,这是我在输入SO时犯的错误。

3 个答案:

答案 0 :(得分:1)

预计会出现错误,因为您已定义$scope.service,其中使用$scope.services注意其他" s"。所以使用正确的变量

$scope.items = $scope.service.getPage(%function_ARGUMENTS%);

但是,您将获得另一个错误,因为函数getPage与返回服务对象相关联。

function listService($state, $rootScope) {
   this.getPage = function() {
     //getPage function definition goes here
   }
}  

OR,

function listService($state, $rootScope) {
   function getPage () {
     //getPage function definition goes here
   }

   this.getPage = getPage;
}  

答案 1 :(得分:1)

angular.module("test").factory("listService", listService);
listService.$inject = ['$state', '$rootScope'];    

function listService($state, $rootScope) {
   return {
      function getPage(%function_ARGUMENTS%) {
         //getPage function definition goes here
      }
   }
}

只需在上面写上服务功能。

答案 2 :(得分:1)

我也注意到: $ scope.items = $ scope.services.getPage(%function_ARGUMENTS%);

应该是: $ scope.items = $ scope.service.getPage(%function_ARGUMENTS%);

当它应该是单数时,$ scope.service在该行上是多元化的。

您也在使用服务服务,这是一个构造函数。因此,您需要使用this关键字引用您的属性。 angular服务方法使用new关键字在内部创建对象。你可以尝试一下工厂:

angular.module("test")
  .factory("listService", listService);
  listService.$inject = ['$state', '$rootScope'];

  function listService($state, $rootScope) {
    function getPage(%function_ARGUMENTS%) {
      //getPage function definition goes here
    }
    return {
      getPage: getPage
    };
 }

这与您所拥有的更相似,并且您不需要使用this关键字,因为它不是构造函数。

希望这有帮助!

干杯