AngularJS:如何在同一服务中正确托管所有CRUD操作

时间:2014-02-15 17:32:10

标签: angularjs

作为AngularJS的新手,我发现自己需要能够在同一个服务中托管所有常见的CRUD操作 - 在我的例子中,是一个名为“requestsRepository”的服务:

frontEndApp.factory('requestsRepository', function ($http) {

    var postServiceRequest = function (ServiceRequest) {
        $http({
            url: 'http://localhost:8080/api/ServiceRequests',
            method: "POST",
            data: ServiceRequest,
            headers: { 'Content-Type': 'application/json' }
        }).success(function (data, status, headers, config) {
            //$scope.persons = data; // assign  $scope.persons here as promise is resolved here 
            console.log("postServiceRequest Status: " + status);
        }).error(function (data, status, headers, config) {
            //$scope.status = status;
            console.log("postServiceRequest FAILURE: " + status + "  ServiceRequest:  " + ServiceRequest);
        });
    };

    var getServiceRequests = function () {
        $http({
            url: 'http://localhost:8080/api/ServiceRequests',
            method: "GET"
        }).success(function (data, status, headers, config) {
            $scope.requests = data;
            console.log("getServiceRequests Status: " + status);
        }).error(function (data, status, headers, config) {
            //$scope.status = status;
            console.log("getServiceRequests FAILURE: " + status + "  ServiceRequest:  " + ServiceRequest);
        });
    };

    return { postServiceRequest: postServiceRequest, getServiceRequests: getServiceRequests };
});

到目前为止,我无法一起托管postServiceRequest和getServiceRequests。

这是我的控制器,它调用requestsRepository.getServiceRequests:

angular.module('frontEndApp').controller('ViewExistingRequestsCtrl', ['$scope',
  function ($scope, requestsRepository) {
      $scope.requests = requestsRepository.getServiceRequests;
  }]);

进行此调用时,我得到:无法读取未定义的属性“getServiceRequests”     在新的(http://myhost.mydomain.com:9221/controllers/ViewExistingRequestsCtrl.js:3:43

我的猜测是,我没有在我的服务中正确公开我的两个功能 - 我只是不知道如何正确地做到这一点,因此同一服务中的每个功能都可以从同一个应用程序中的任何控制器到达。

1 个答案:

答案 0 :(得分:1)

看起来requestRepository未定义。

尝试将控制器定义修改为如下所示:

   angular.module('frontEndApp').controller('ViewExistingRequestsCtrl', ['$scope', 'requestsRepository',
  function ($scope, requestsRepository) {
      $scope.requests = requestsRepository.getServiceRequests;
  }]);

注意在数组中添加'requestsRespository'。

通过创建一个包含“$ scope”的数组,您已经明确指定了在创建控制器时要解决的依赖项的名称。此数组不包含应为requestsRespository变量注入的服务的名称。通过将“requestsRepository”添加到数组中,angularjs将知道要注入的服务。

您不必在数组中提供“$ scope”和“requestsRespository”。 Angularjs应该能够计算出依赖项的名称以自动解析,因为控制器函数定义中的参数名称与正在注入的服务的名称相匹配。考虑到这一点,以下代码段也应该有效:

angular.module('frontEndApp').controller('ViewExistingRequestsCtrl', 
  function ($scope, requestsRepository) {
      $scope.requests = requestsRepository.getServiceRequests;
  });