ho letto queste due grandi articoli:AngularJS: In che modo i controller e le fabbriche/servizi devono essere strutturati con un modello di oggetto ricco e gerarchico?
The state of angularjs controllers di Jonathan Creamer
e
Rethinking AngularJS Controllers da Todd Motto
In questi articoli, gli autori parlano il modo giusto di usare i controller (fare loro ponti anemici tra la vista e il modello) e fabbriche/servizi (dove la logica di business dovrebbe davvero vivere).
Questa è una grande informazione, ed ero davvero entusiasta di iniziare a refactoring i controller su uno dei miei progetti, ma ho subito scoperto che la struttura mostrata negli articoli si rompe se si dispone di un modello di oggetto ricco.
Ecco un riassunto del setup da "Ripensare Controllers Angularjs":
Ecco il controllore:
app.controller('InboxCtrl', function InboxCtrl (InboxFactory) {
var vm = this;
vm.messages = InboxFactory.messages;
vm.openMessage = function (message) {
InboxFactory.openMessage(message);
};
vm.deleteMessage = function (message) {
InboxFactory.deleteMessage(message);
};
InboxFactory
.getMessages()
.then(function() {
vm.messages = InboxFactory.messages;
});
});
ed ecco la fabbrica:
app.factory('InboxFactory', function InboxFactory ($location, NotificationFactory) {
factory.messages = [];
factory.openMessage = function (message) {
$location.search('id', message.id).path('/message');
};
factory.deleteMessage = function (message) {
$http.post('/message/delete', message)
.success(function (data) {
factory.messages.splice(index, 1);
NotificationFactory.showSuccess();
})
.error(function() {
NotificationFactory.showError();
});
};
factory.getMessages = function() {
return $http.get('/messages')
.success(function (data) {
factory.messages = data;
})
.error(function() {
NotificationFactory.showError();
});
};
return factory;
});
Questo è grande e perché providers
(la fabbrica) sono singleton, i dati vengono mantenuti attraverso le visualizzazioni e sono accessibili senza dover ricaricarli dall'API.
Questo funziona perfettamente se messages
è un oggetto di livello superiore. Ma cosa succede se non lo sono? Che cosa succede se questa è un'app per sfogliare le caselle di posta di altri utenti? Forse sei un amministratore e vuoi essere in grado di gestire e sfogliare le caselle di posta di qualsiasi utente. Forse hai bisogno di più caselle di posta degli utenti caricate contemporaneamente. Come funziona? Il problema è che i messaggi di posta in arrivo sono memorizzati nel servizio, ad esempio InboxFactory.messages
.
Che cosa succede se la gerarchia è come questo:
Organization
|
__________________|____________________
| | |
Accounting Human Resources IT
| | |
________|_______ _____|______ ______|________
| | | | | | | | |
John Mike Sue Tom Joe Brad May Judy Jill
| | | | | | | | |
Inbox Inbox Inbox Inbox Inbox Inbox Inbox Inbox Inbox
Ora messages
sono diversi livelli di profondità nella gerarchia, e non hanno alcun significato per conto proprio. Non è possibile memorizzare i messaggi in fabbrica, InboxFactory.messages
perché è necessario recuperare i messaggi per più utenti alla volta.
Ora si avrà OrganizationFactory, DepartmentFactory, UserFactory e InboxFactory. Il recupero dei "messaggi" deve essere nel contesto di un user
, che si trova nel contesto di un department
, che si trova nel contesto di un organization
. Come e dove devono essere memorizzati i dati? Come dovrebbe essere retreived?
Quindi come dovrebbe essere risolto? Come dovrebbero essere strutturati i controller, le fabbriche/i servizi e i modelli di oggetti ricchi?
A questo punto del mio pensiero, mi sto appoggiando solo a mantenerlo snello e senza avere un modello di oggetto ricco. È sufficiente archiviare gli oggetti sull'oggetto $ iniettato nel controller e, se si passa a una nuova vista, ricaricare dall'API. Se hai bisogno di dati alcuni persistono attraverso le viste, è possibile creare quel ponte con un servizio o fabbrica, ma non dovrebbe essere il modo di fare cose più.
Come hanno risolto gli altri questo? Ci sono dei modelli là fuori per questo?
Se questo non dovesse essere un compito per il backend endpoint? Quindi se hai effettuato l'accesso come Jonh 'GET/messages' restituisce i messaggi solo per John e l'interfaccia è diversa da quella che il capo dell'organizzazione vede quando ha effettuato l'accesso. – Terafor