2014-05-22 5 views
2

컨트롤러에서 Restangular를 사용하는 방법을 알고 있지만 내 생각에 Restangular는 본질적으로 스테로이드의 ORM입니다.AngularJS - 공장에서 Restangular가있는 REST API를 사용합니다.

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 질문 2 : 이러한 방법이 이미 Restangular에서 제공되는 경우 모든 단일 공장에 대해 C-R-U-D에 대한 개별 방법을 만들어야한다는 것을 고려하여 과도한 엔지니어링을 시도하고 있습니까? 다음

답변

2

는 본질적 https://github.com/mgonto/restangular#decoupled-restangular-service

에서 솔루션을 발견 I이 문제를 해결 한 방법이다 :

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

을 app.js 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() 
    } 
    }; 
}]);