Questo è chiamato Bus Eventi ed è un modo molto utile per disaccoppiare il tuo codice quando non vuoi che ogni post AJAX (o qualsiasi altra azione in tal senso) debba esplicitamente indica cosa deve succedere di conseguenza.
// We've consolidated this functionality in an event manager, which gives us more power
// to log and recover from errors in event handlers.
EventManager.subscribe('ContentAdded', function(e) {
// color every other row whenever content is added to the DOM.
$('table.grid>tbody>tr:nth-child(even)', e.Content).addClass('even-row');
});
Nota come posso pubblicare questo evento ovunque io desideri nel codice, e nessuno di quei posti deve essere a conoscenza di questo codice. Posso anche gestire l'evento ovunque desideri, senza essere strettamente collegato al codice di pubblicazione.
Nel progetto (ASP.NET MVC) su cui lavoro, abbiamo trovato che questo approccio è così efficace che abbiamo quasi eliminato qualsiasi altro tipo di chiamate AJAX. Abbiamo il nostro framework basato sugli eventi al punto in cui la maggior parte dei nostri collegamenti AJAX utilizza un unico gestore di callback globale che pubblica semplicemente gli eventi restituiti dal server. Qualsiasi modulo interessato a ricevere notifiche quando si verificano eventi specifici può iscriversi a questi eventi a livello globale.
Potrei creare un collegamento usando un codice come questo:
@Html.EventAction("Create Task", "CreateTask")
... che il mio framework può rendere come HTML in questo modo:
<a href="/.../CreateTask" data-ajax="true" data-ajax-success="EventHandlers.Success">
Create Task
</a>
Quando l'utente fa clic su questo link, viene sequestrato per eseguire una richiesta AJAX a un'azione come questa:
public ActionResult CreateTask()
{
if(!UserCanCreateTasks())
return Events.ErrorResult("You don't have rights to create tasks.");
Events.OpenModalDialog("Create Task", "TaskEditView", new TaskEditViewModel());
return Events.Result();
}
Ciò genererebbe a sua volta un oggetto JSON con un ModalDialogOpenedEvent
, che include i contenuti di rendering della finestra di dialogo.
Il metodo EventHandlers.Success
pubblicherà semplicemente tutti gli eventi che ritornano, causando indirettamente un gestore come questo da invocare:
EventManager.subscribe('ModalDialogOpenedEvent', function(e) {
createDialog(e.Title, e.Contents);
});
Quindi la nostra logica di controllo può effettivamente rimanere nel nostro controller e abbiamo ridotto drasticamente la quantità di javascript personalizzati che dobbiamo scrivere per una determinata funzionalità. Non è più necessario scrivere codice del gestore personalizzato per ogni tipo di pulsante nella nostra interfaccia utente e non dobbiamo preoccuparci di ciò che accade quando il server restituisce una risposta che non ci aspettavamo.
Ad esempio, se la sessione dell'utente è scaduta, il codice azione non verrà nemmeno richiamato: il server reindirizzerà immediatamente la richiesta AJAX a un gestore di accesso. Abbiamo scritto il gestore di accesso per essere abbastanza intelligente da rilevare se si tratta di una richiesta AJAX event-driven e restituire un evento che causa l'apertura di una finestra di dialogo di accesso. La richiesta che l'utente stava tentando di eseguire viene salvata fino a quando il server non restituisce un evento per indicare che l'accesso è riuscito e quindi viene ritentato automaticamente. Puoi immaginare quanto codice extra richiederebbe se ogni richiesta AJAX nel nostro sistema dovesse essere pronta a gestire questo tipo di caso angolare. Ma con un sistema basato su eventi, è un gioco da ragazzi.