AngularJS - 在工厂中使用Restangular来使用REST API

时间:2014-05-22 08:36:20

标签: angularjs api restangular

我理解如何在控制器中使用Restangular,但我的想法是Restangular基本上是类固醇的ORM。

ORM不应该知道应用程序的状态。这是控制器的工作。

我还想重新使用ORM查询,因此我相信Restangular应该在服务中使用。

我的问题是我是一个js / angularjs和restangular noob,只有大约2-3个月的exp,有任何前端。

我的控制器:

app.controller('AdminSupplierIndexController', 
    ['$scope', '$stateParams', '$state', 'Supplier', 
    function ($scope, $stateParams, $state, Supplier) {


        $state.reload();

        Supplier.getAll.then(function (suppliers) {
            $scope.suppliers = suppliers;
        });
}]);

app.controller('AdminSupplierDetailController', 
    ['$scope', '$stateParams', 'Supplier', 
    function ($scope, $stateParams, Supplier) {

        Supplier.getOne({ supplierId : $stateParams.supplierID}).then(function(supplier) {
            $scope.supplier = supplier;
        });
}]);

我的工厂

app.factory('Supplier', ['Restangular', function (Restangular) {
    return {
        getAll: Restangular.all('supplier').getList(),
        getOne: Restangular.one('supplier', supplierId).get()
    };
}]);

我的Supplier.getAll方法运行正常 - 我可以列出供应商工厂的所有供应商。 我的问题在于我的Supplier.getOne方法。

问题1:如何将supplierId注入工厂?我得到ReferenceError: supplierId is not defined 问题2:考虑到当Restangular提供这些方法时,我必须为每个工厂创建C-R-U-D的单独方法,我是否试图过度设计?

2 个答案:

答案 0 :(得分:3)

我知道这是旧的,但另一种方法就是将它包装在一个函数中。这样,您可以在服务/方法中保留任何其他逻辑。

app.factory('Supplier', ['Restangular', function (Restangular) {
  return {
    getAll: Restangular.all('supplier').getList(),
    getOne: function(supplierId) {
      return Restangular.one('supplier', supplierId).get()
    }
  };
}]);

答案 1 :(得分:2)

https://github.com/mgonto/restangular#decoupled-restangular-service

中找到解决方案

基本上,我解决这个问题的方法如下:

app.js

$stateProvider

            ...

    .state('admin.supplier', {
        url : "/supplier",
        templateUrl : 'templates/admin/supplier/index.html',
        controller: "AdminSupplierIndexController",
        resolve: {
            suppliers: ['Supplier', function(Supplier) {
                return Supplier.getList();
            }]
        }
    })
    .state('admin.supplier.detail', {
        url : "/:supplierId",
        templateUrl : "templates/admin/supplier/detail.html",
        controller: "AdminSupplierDetailController",
        resolve: {
            supplier : ['Supplier', '$stateParams', function(Supplier, $stateParams) {
                return Supplier.one($stateParams.supplierId).get();
            }]
        }
    })
            ...

Supplier.js

app.factory('Supplier', ['Restangular', function(Restangular) {
    return Restangular.service('supplier');
}]);

SupplierControllers.js

app.controller('AdminSupplierIndexController', ['$scope', '$stateParams', '$state', 'suppliers', 
    function ($scope, $stateParams, $state, suppliers) {

        $state.reload();

        $scope.suppliers = suppliers;
}]);

app.controller('AdminSupplierDetailController', ['$scope', 'supplier', 
    function ($scope, supplier) {

        $scope.supplier = supplier;
}]);