Factory中的Restangular嵌套Rest资源

时间:2014-12-02 09:28:04

标签: javascript angularjs api rest restangular

我的服务

app.factory('PartnerServiceRestangular', ['Restangular', function(Restangular) {

    return Restangular.service('partner');

}]);

app.factory('PartnerInvoiceServiceRestangular', ['PartnerServiceRestangular', function(PartnerServiceRestangular) {

    return PartnerServiceRestangular.one('partner', partnerId).service('invoice');

}]);

我的控制器

app.controller('FinancialsController', [
    '$scope',
    'PartnerServiceRestangular',
    'PartnerInvoiceServiceRestangular',
    function($scope, PartnerServiceRestangular, PartnerInvoiceServiceRestangular) {

    PartnerServiceRestangular.getList().then(function(partners) {
        $scope.partners = partners;
    });

    $scope.partnerChange = function(partner) {
        $scope.partner = partner;
    };

    var getInvoices = function(partnerId, startDate, stopDate) {

        // STUCK HERE
        PartnerInvoiceServiceRestangular.get({})    
    };

我要做的是允许PartnerInvoiceServiceRestangular执行以下获取请求:

  • /partner/{partnerId}/invoice/ - 返回特定partnerId的所有发票
  • /partner/{partnerId}/invoice/?startDate=2014-06-01&stopDate=2014-6-30 - 返回2个给定日期之间的所有发票
  • /partner/{partnerId}/invoice/{invoiceId} - 要退回特定发票

我已经在视图中设置了ng-models设置partnerIdstartDatestopDate

的$范围

2 个答案:

答案 0 :(得分:2)

这样的事情应该有效。

app.factory('PartnerInvoiceServiceRestangular', ['PartnerServiceRestangular', function(PartnerServiceRestangular) {

    return {
        getService: function(partnerId) {
             PartnerServiceRestangular.one('partner', partnerId).service('invoice');
        }
    }

}]);


var getInvoices = function(partnerId, startDate, stopDate) {
    PartnerInvoiceServiceRestangular.getService(partnerId)
       .getList({ startDate: startDate, stopDate: stopDate }).then(function(invoices) {
            $scope.partner.invoices = invoices;
       }
};

但是,我不是您工厂服务实施的粉丝。为什么不直接使用:

$scope.partnerChange = function(partner) {
    $scope.partner = partner;
    partner.getList('invoice', { startDate: startDate, stopDate: stopDate }).then(function(invoices) {
            $scope.partner.invoices = invoices;
       });
};

答案 1 :(得分:0)

快速回答。

让我们看看“解耦的Restangular服务”部分:https://github.com/mgonto/restangular#decoupled-restangular-service

我们也可以使用嵌套的RESTful资源:

var Cars = Restangular.service('cars', Restangular.one('users', 1));

Cars.getList() // GET to /users/1/cars

在你的情况下它会是这样的:

var partner = PartnerServiceRestangular.one(1);
var invoices = Restangular.service('invoice', partner);

但不确定您的PartnerInvoiceServiceRestangular工厂设计得好。

希望这有帮助。