簡體   English   中英

AngularJS-在工廠中使用帶有Restangular的REST API

[英]AngularJS - Consuming REST API with Restangular in a factory

我知道如何在控制器中使用Restangular,但是我的想法是Restangular本質上是類固醇的ORM。

ORM不應了解應用程序的狀態。 那就是控制器的工作。

我還想重用對ORM的查詢,因此,我相信Restangular應該在服務內部使用。

我的問題是我是一個js / angularjs和restangular noob,只有大約2-3個月的經驗與任何前端。

我的控制器:

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 providerId問題2:我是否正在考慮過度設計某些事情,因為當Restangular已提供這些方法時,我必須為每個工廠創建CRUD的單獨方法?

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

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

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;
}]);

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM