Best practices für die Erstellung von CRUD-services in AngularJS
Was ist die beste übung für die Gestaltung von CRUD-services /Fabriken innerhalb einer AngularJS-Anwendung, die Prozess single und mehrere Entitäten?
Zum Beispiel habe ich eine customer
Objekt in einer Fabrik namens customerFactory
enthält eine Struktur ähnlich dieser:
var customer = {
newCustomer: false,
selfUri: null,
editUri: null,
deleteUri: null,
customerName: null,
customerAddress: null
};
Und dass ich auch die folgenden Beispiel-Funktionen ausgesetzt, die Fabrik, das aufrufen von REST-services:
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', {} );
}
Alle diese Methoden funktionieren im Grunde auf die customer
Objekt innerhalb der Fabrik.
Sollte die readAll()
Methode in einem anderen Dienst - /Werk behandelt abrufen ALLE Kunden, anstatt in der genannten Fabrik, wie es sich mit single Entitäten? Sollten REST-Aufrufe abrufen, die mehrere Entitäten werden in einem eigenen Werk geliefert?
Beispiel: customerFactory
//Deal with single customer entities
app.factory('customerFactory', ['$http',
function($http) {
var customerFactory = {};
var customer = {
newCustomer: false,
selfUri: null,
editUri: null,
deleteUri: null,
customerName: null,
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;
}]);
Beispiel: customersFactory
//Deal with multiple customer entities
app.factory('customersFactory', ['$http',
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;
}]);
- Wow.... Sie konvertieren Schienen Weg in angularJS. sehr interessant. Ich denke, Sie sollten gehen mit diesem, wenn Sie sind komfortabel mit ihm. Vielleicht, dass die Namensgebung customerFactory und customersFactory sind schwer zu unterscheiden.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Lassen Sie mich Vorwort mit den Worten ich bin ziemlich neu zu eckig. Mit dieser sagte, können Sie eine CustomerClass, die verwendet wird, in die CustomerList-und Kunden-services. Die customerlist-service gibt ein array zurück, in der Erwägung, dass der Kunden-service wird wieder einen einzelnen Kunden. Obwohl ich fügen Sie Sie der app mit .(Fabrik), sind Sie als Service verwendet werden.
Beachten Sie, dass CustomerClass gibt nur die Funktion (Klasse), ohne ein neues Stichwort. Dies ist, so dass Sie instanziieren Sie ein neues CustomerClass auf Ihrem eigenen in andere Dienste. Das selbst.Funktion init ist der Konstruktor und es wird verlängert automatisch die Werte von einem Objekt, das Sie übergeben. Selbst.init wird automatisch aufgerufen, direkt unter der Erklärung.
Benutze ich Selbst.bereit in meine Fabriken so, dass wenn ich mit ng-repeat, wird es nicht zeigen, es sei denn, das Werk hat den status ready=true. Denn Sie ziehen von Daten in eine ajaxy Weise, die Sie nicht möchten, aktualisieren Sie die Ansichten, die mit nichts, bis die Daten empfangen werden und fertig.
self.ready
mitng-repeat
? Können Sie verdeutlichen dies mit einem Beispiel wie ich bin relativ neu eckig als gut. Danke!customerList
service in einem controller, wenn ich wählen Sie den ersten Kunden in der Liste, z.B.$scope.selected = { item: customerList.customers[0] };
? Ich bin immerready=false
womit der Dienst noch nicht beendet AuffüllencustomerList
. Auch, wie ich pass inid
für diecustomerSingle.getOneCustomer
Methode? Ich nehme an, ich muss nur einen parameter hinzufügeninit()
und entfernen Sie dieself.init()
Methode nennen?Ich würde es vorziehen, Sie zu benutzen
$resource
wird, passt besser in deinem Fall.Nur Sie schreiben müssen, eine einzelne Methode in einem Dienst kann entfernen Sie alle redundanten code in Ihrem Dienst, wie es werden so tun, als
GET, PUT, DELETE & UPDATE
Fabrik CODE
Controller
Über single-service-Methode kann man viele Sache. Ich würde lieber mit
$resource
beim Umgang mit REST-APIWeitere detaillierte Informationen besuchen Sie hier
Update
Wenn Sie immer noch wollen, zu halten mit
$http
Für Ihren code besser wiederverwendbar werde ich vermeiden, zu erstellencustomerFactory
ist, dass alle Methoden beziehen sich auf Kunden, Anstatt, dass ich lieben würde, zu erstellenangular.constant
durch die Nutzung dieser Konstanten-array erstellen wir eine neue service-mit diesem array.Konstante
Fabrik
Ihre re-einkalkuliert code wird so Aussehen wie oben. Es ist zwar nicht getestet, aber ich bin sicher, der Weg wäre, wie dies nur.
Hoffe das konnte dir helfen. Danke.
$resource
für die Kommunikation mit REST-services so zu sein scheint, dass viel sauberer. Danke!$resource
welche intern verwendet$httpProvider
eckig