如何将URL传递给Angular JS工厂中存在的$ resource

时间:2019-03-29 14:54:35

标签: angularjs angularjs-service ngresource

以前,我是通过angular js中的某些服务传递url的。现在,我想将URL作为参数从控制器传递给$ resource。

我试图将url从控制器传递到资源,但是它抛出未找到url对象的错误。

以下是我当前的工厂代码:

angular.module('Services').factory('PatientsService', ['$resource', 'Service', '$http',

    function(Resource, Service, Http) {

        return {
            testGetPatients : Resource(Service.getPatientsCustomRefURL(), {}, {
                query : {
                    method : 'GET',
                    isArray : false
                }
            })
        };                                                                                                                                                                                                                                                                                                                                                                                                      
}]);

在上面的代码中,我从 Service.getPatientCUstomRefURL

发送url参数

对$ resource的实际调用如下所示:

PatientsService.getPatientsRef.query(function(refResponse) { 
//TODO for response
});

现在,我想传递Parameter像这样:

PatientsService.getPatientsRef.query("/patient/list",function(refResponse) {
//TODO for response
 });

我应该在PatientService工厂中进行哪些更改,以便支持将url作为参数传递。

这是将为$ resource创建url的代码 服务代码

angular.module('Services', ['ngResource']).factory('Service', ['$resource', '$location', '$rootScope',
                                                               function($resource, $location, $rootScope) {
    return {
        getPatientsCustomRefURL: function() {
            return '/patient/list';
        }
    };
}
]);

注意

PatientService中有很多方法,因此我不想为每个$ resource在PatientService中添加额外的功能,这会将url作为参数传递给

angular.module('Services').factory('PatientsService', ['$resource', 'Service', '$http',
        function(Resource, Service, Http) {

            return {
                testGetPatients : function(url){
                 return Resource(url, {}, {
                    query : {
                        method : 'GET',
                        isArray : false
                    }
                })
            }
            };                                                                                                                                                                                                                                                                                                                                                                                                      
       }]);

2 个答案:

答案 0 :(得分:0)

  

现在,我想传递Parameter像这样:

PatientsService.getPatientsRef.query("/patient/list",function(refResponse) {
//TODO for response
 });

对于这样的API调用,使用$http服务会更容易:

$http.get("/patient/list").then(function(response) {
    var refResponse = response.data;
    //TODO for response
});

通过$resource服务更改url的标准方法是在url模板中定义参数:

var service = $resource("/api/:slug/list", {slug: patient}, {
    getByID: {
        url: "/api/:slug/:id",
        method: "GET",
        isArray: false,
   }
);

示例:

$scope.patients = service.query(); //returns array from
//  api/patient/list 

$scope.doctors = service.query({slug: doctor}); //returns array from
//  api/doctor/list

$scope.patientRecord = service.getById({id: 1234}); //returns object from
//  api/patient/1234

$scope.patientRecord = service.get({id:1234}); //returns object from
//  api/patient/list?id=1234

参数化的URL模板使用:前缀的参数/user/:username。如果您使用带有端口号的URL(例如http://example.com:8080/api),则会受到尊重。

参数对象中的每个键值都首先绑定到url模板(如果存在),然后将多余的键附加到?之后的url搜索查询中。

重要的是要意识到调用$ resource对象方法会立即返回空引用(对象或数组取决于isArray)。从服务器返回数据后,将使用实际数据填充现有引用。这是一个有用的技巧,因为通常资源会分配给模型,然后由视图呈现。

有关更多信息,请参见AngularJS $resource API reference - Arguments

答案 1 :(得分:0)

对于上述问题,您可以将现有的$ resource包装在某些函数中,并将URL传递给该函数。

angular.module('Services').factory('PatientsService', ['$resource', 'Service', '$http',
        function(Resource, Service, Http) {

            return {
                testGetPatients : function(url){
                 return Resource(url, {}, {
                    query : {
                        method : 'GET',
                        isArray : false
                    }
                })
            }
            };                                                                                                                                                                                                                                                                                                                                                                                                      
       }]);

有意义。