在AngularJS中创建CRUD服务的最佳实践
发布时间:2020-12-17 17:14:19 所属栏目:安全 来源:网络整理
导读:在处理单个和多个实体的AngularJS应用程序中设计CRUD服务/工厂的最佳实践是什么? 例如,我在名为customerFactory的工厂中有一个客户对象,其中包含与此类似的结构: var customer = { newCustomer: false,selfUri: null,editUri: null,deleteUri: null,custom
在处理单个和多个实体的AngularJS应用程序中设计CRUD服务/工厂的最佳实践是什么?
例如,我在名为customerFactory的工厂中有一个客户对象,其中包含与此类似的结构: var customer = { newCustomer: false,selfUri: null,editUri: null,deleteUri: null,customerName: null,customerAddress: null }; 并且我还在调用REST服务的工厂上公开了以下示例函数: var create = function() { $http.post('api/customers/1',{ customer: customer } ); } var read = function() { $http.get('api/customers',{ params { uri : customer.selfUri } ); } var update = function() { $http.put('api/customers/1',{ customer: customer } ); } var delete = function() { $http.delete('api/customers/1',{ uri: customer.deleteUri } ); } // This is an oddity and probably shouldn't be in this factory?? var readAll = function() { $http.get('api/customers',{} ); } 所有这些方法基本上都适用于工厂内的客户对象. 是否应将readAll()方法放入处理检索所有客户的不同服务/工厂,而不是在处理单个实体时放入上述工厂?是否应该将检索多个实体的REST调用放入其自己的工厂? 示例:customerFactory // Deal with single customer entities app.factory('customerFactory',['$http',function($http) { var customerFactory = {}; var customer = { newCustomer: false,customerAddress: null }; var create = function() { $http.post('api/customers/1',{ customer: customer } ); } var read = function() { $http.get('api/customers',{ params { uri : customer.selfUri } ); } var update = function() { $http.put('api/customers/1',{ customer: customer } ); } var delete = function() { $http.delete('api/customers/1',{ uri: customer.deleteUri } ); } customerFactory.create = create; customerFactory.read= read; customerFactory.update= update; customerFactory.create = delete; return customerFactory; }]); 示例:customersFactory // Deal with multiple customer entities app.factory('customersFactory',function($http) { var customersFactory = {}; var customers = {}; var readAll = function() { $http.get('api/customers',{} ).then(function(response) { customers.push(response.data); }); customersFactory.readAll = readAll; return customersFactory; }]); 解决方法
让我先说一下我对角度很新.话虽如此,您可以创建CustomerList和Customer服务中使用的CustomerClass. customerlist服务将返回一个数组,而客户服务将返回一个客户.即使我使用.factory()将它们添加到应用程序,它们也可用作服务.
请注意,CustomerClass仅返回没有new关键字的函数(class).这样您就可以在其他服务中自己实例化一个新的CustomerClass. self.init函数是构造函数,它将自动扩展您传入的对象的值.在声明下自动调用Self.init. 我在我的工厂中使用Self.ready,这样如果我使用ng-repeat,除非工厂的状态为ready = true,否则它不会显示.因为您是以ajaxy方式提取数据,所以在收到并准备好数据之前,您不希望用任何内容更新视图. myApp.factory("CustomerClass",function ($http) { function CustomerClass(extendableObject) { var self = this; self.init = function () { //will extend newCustomer,selfUri,editUri etc... fields angular.extend(self,extendableObject); }; self.init(); } return CustomerClass; }); myApp.factory("CustomerListService",function ($http,CustomerClass) { function CustomerList() { var self = this; self.ready = false; //return array of customer objects self.readAll = function () { var customers = []; $http.get('api/customers/list') .success(function (payload) { angular.forEach(payload.customers,function (customer) { customers.push(new CustomerClass(customer)); }); self.ready = true; return customers; }); }; } return new CustomerList; }); myApp.factory("CustomerService",CustomerClass) { function Customer() { var self = this; self.ready = false; //return one customer object self.read = function (id) { $http.get('api/customers/single',{params: {id: id}}) .success(function (payload) { return new CustomerClass(payload); self.ready = true; }); }; } return new Customer; }); (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |