2014-05-22 55 views
2

我明白如何在控制器中使用Restangular,但是我的想法是Restangular本質上是類固醇的ORM。AngularJS - 在工廠中使用Restangular的REST API

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

發現在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; 
}]); 
3

我知道這是舊的,但另一種方式只是將它包裝在一個函數中。這樣,您可以在服務/方法中保留任何其他邏輯。

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