Mit selben controller für alle CRUD-Operationen (Schienen-alike)
Habe ich eine eckige controller, holt eine Ressource, die auf die Bildung:
angular.module('adminApp')
.controller('PropertiesCtrl', function ($log, $scope, Property, $location) {
$scope.properties = Property.query()
});
Nun möchte ich hinzufügen, dass die Logik der controller in der Lage sein, um eine "Eigenschaft" Ressource:
angular.module('adminApp')
.controller('PropertiesCtrl', function ($log, $scope, Property, $location) {
$scope.properties = Property.query()
$scope.create = function(){
//logic to create
};
});
Jedoch, wenn ich auf das Formular zum erstellen einer "Eigenschaft", ein unnötiger Aufruf von fetch alle Eigenschaften ersten. Wie kann ich diese vermeiden?
Mögliche Lösungen?
- Konnte ich erstellen Sie einen separaten controller, der speziell für die Schaffung von Eigentum, das nicht Holen der Eigenschaften. Allerdings wäre es einfacher, die Kapseln alle CRUD-Operationen für eine einzige Ressource, die unter einer einzigen Steuerung.
- Ich erstellen Sie eine Funktion zum abrufen aller Eigenschaften. Aber, meine index-Seite verwendet "Eigenschaften" direkt. Ich würde zunächst müssen die Daten abzurufen, ruft eine Methode aus und verwenden Sie die Daten (irgendwie?)
- Ist dieser Schritt $Umfang.properties = Eigentum.query() notwendig?
- Ich brauche, um die Eigenschaften auf meiner index-Seite. So ist es nur notwendig, in die index-Seite (die mit der PropertiesCntrl). Jedoch, wäre es nicht notwendig, in der Seite erstellen ...
- Dann ist die erste option in Ihrer eigenen möglichen Lösungen wäre eine sinnvolle option.
- die Sache mit meiner ersten Lösung ist, dass es würde bedeuten, dass die CRUD-Operationen für eine einzige Ressource würde gestreut werden, um verschiedene Controller ... cld gibt es einen besseren Weg?
- Naja... Es ist nicht ungewöhnlich, dass eine Ansicht mit einer Liste der Elemente und eine andere Ansicht zum hinzufügen/Bearbeiten einer dieser Artikel... wäre Es ein problem wenn man 4 verschiedene Ressourcen interagieren mit dem server... es ist nicht ein problem zu haben mit mehreren Ansichten unter Verwendung der gleichen Ressource... Es ist schlimmer für die Logik von mehreren Seiten in einer einzigen Steuerung...
- Sollten Sie feststellen, dass diese neueren Artikel hilfreich (es umfasst auch mehr in die Tiefe, die Fälle wie mit
resolve
Aussagen): scotch.io/tutorials/making-skinny-angularjs-Controller
Du musst angemeldet sein, um einen Kommentar abzugeben.
Meine Reaktion ist, dass es klingt wie Sie versuchen, verwenden Sie einen controller wie einen service, und wie Sie versuchen, zu viele Funktionen in einem controller.
Also es gibt zwei wichtigsten Dinge, die Sie denken sollten. Zunächst ist es ziemlich wichtig, erstellen controller haben nur eine bestimmte Zweck jeder. Beachten Sie, dass dies nicht das gleiche wie mit dem controller nur einmal, Sie sind encuraged verwenden die gleichen controller in verschiedenen Orten, wenn Sie haben eine Funktion, die angezeigt wird, in mehr als einem Ort. Es bedeutet nur, dass der controller sollte nicht mehrere Dinge auf einmal.
Nehmen wir eine Foto-Galerie ist so ein Beispiel. Zwar konnte man erstellen Sie einen controller, der bekommt alle Fotos, können Sie neue Fotos hinzuzufügen, und Sie können Sie Bearbeiten und löschen vorhandener Fotos alles in einem, das wäre eine schlechte Idee. Was, wenn Sie entscheiden, dass das hinzufügen eines Fotos können auch gemacht werden, von einer anderen Seite, "Seite X"? Wenn Sie, wo Sie verwenden Sie den gleichen controller, dann würde sich auch sein Interesse an der Galerie vom server und einrichten der Bedienelemente für die Dinge, die Sie nicht wollen sein auf dieser Seite.
Wenn Sie stattdessen aus einem controller, der ist nur dafür verantwortlich, die Inhalte, separate Steuerung für das hinzufügen von neuen Fotos, die andere für die Bearbeitung, etc, dann wäre es einfach. Sie würde nur dann implementieren Sie die create-controller auf "Seite X" und Sie nicht haben, um sorgen über versehentlich auslösen mehr, als Sie wollte. Sie können wählen, zu implementieren, die genau die Funktion, die Sie wollen auf der einen Seite und nur diese Funktion. Dies hält auch Ihre Controller klein, leicht zu Lesen und schnell zu Bearbeiten/bugfix, so ist es eine win/win!
Zweitens, wenn Sie möchten, sammeln Sie alle Ihre CRUD-Ressourcen in einem Objekt (das würde ich auch tun wollen), sollten Sie nicht in einem controller, Sie sollten in ein service. So haben Sie eine PhotoAPI, welche macht das ERSTELLEN, LESEN, AKTUALISIEREN und LÖSCHEN von Funktionen. Dann den index-controller ruft einfach nur die READ-Funktion erstellen Sie Ihre controller die Funktion ERSTELLEN etc. Die Controller definieren, welche Funktionen und Daten verfügbar sind, wo aber die Logik ist in der Kombination service. Auf diese Weise können Sie Land, Ihre Ressourcen, damit Sie leicht zu finden, ohne dass dabei die Probleme, die mit mit einem controller kombiniert.
So etwas wie:
Sehe ich von deiner Frage (und von Ihr SO tags), die Sie möchten, erstellen Sie eine Rails-artige Controller in AngularJS. Da beide frameworks (Rails und AngularJS) einen ähnlichen MVC-Prinzip ist eigentlich Recht einfach zu bewerkstelligen.
Beide frameworks erlauben Sie anweisen, die verschiedenen Routen zu den gleichen controller verwenden.
In Schienen, Ihre üblichen index/show/neu/Bearbeiten/löschen-Methoden (Aktionen) sind out of the box (mit Gerüst). Diese Standard-Aktionen zugeordnet sind, die verschiedene, gut etablierte Routen und HTTP-Methoden.
CRUD/Liste Routen in Rails
Nun, in AngularJS-Anwendungen (oder alle SPAs für diese Angelegenheit), müssen Sie nur einen Teil dieser Routen, weil client-side routing versteht nur GET-Anfragen:
CRU/Liste Routen in AngularJS
AngularJS nativ nicht ein scaffolding-Mechanismus generieren würden alle Ihre CRUD-Routen für Sie. Aber trotzdem bietet Sie mit mindestens zwei verschiedenen Arten der Verkabelung bis Ihre CRUD/Liste Strecken mit einem einzigen controller.
Option 1 (
$location.path()
)Mit Standort.Pfad () - Methode können Sie die Struktur Ihrer
PhotosCtrl
zu tun verschiedene Dinge, je nachdem, gut Pfad.Routen:
Controller:
Diese vier
ifs
macht der controller sieht etwas unübersichtlich aus, aber beim ersetzen von 4 unterschiedlichen Controllern mit ein, paar Konditionen unvermeidlich sind.Option 2 (Mit beheben Eigentum)
Diese option bedient sich die
resolve
Eigenschaft der route-Konfiguration-Objekt, um verschiedene 'Aktion identifier " für die verschiedenen Strecken.Routen:
Controller:
Beide Methoden erfordern die Verwendung einiger Bedingungen in Ihrem controller, aber die zweite Methode ist zumindest ein wenig klarer zu Lesen, da die genaue Handlung ist behoben, innerhalb des routing-Mechanismus, der braucht etwas Logik aus Ihrem anstrengenden controller.
Natürlich in jedem real-Welt-Anwendung, die Sie haben wahrscheinlich viele weitere Methoden definiert, die in der Steuerung, in welchem Fall Sie Ihre Steuerung ganz unlesbar. Diese Beispiele verwenden eine einfache $Ressource-Instanz (
Phones
), die basiert auf einem einfachen Erholsamen backend-API (Rails?).Aber, wenn die view-Logik wird komplexer, werden Sie wahrscheinlich wollen, zu beschäftigen Winkel-Dienstleistungen/Fabriken, um zu abstrahieren, einige der code im Controller.
Es ist gut, mehrere Ansichten (und Controller) unter Verwendung der gleichen Ressource... Es ist kein schlechtes design.
Wenn Sie mehr als 1 Ressource zu tun, alle CRUD-Operationen, das wäre ein problem.
Gehen mit Ihrer ersten Lösung. 1 controller pro view. Es ist die Ressource, die neu zu gruppieren alle CRUD-Operationen, nicht einen einzigen controller.