2013-01-15 12 views
6

Questa domanda probabilmente non ha una risposta. Ma, pensavo di fare un tentativo. Ho scritto una grande applicazione a una pagina. All'avvio dell'applicazione, la scheda aperta "registra" sé stessa con il server, che memorizza come una scheda "attiva".Riconoscere quale scheda ha effettuato la richiesta

Se l'utente A modifica XYZ nell'area di lavoro, ogni scheda aperta su quell'area di lavoro, da qualsiasi utente, riceve una notifica che XYZ è stato modificato. Ciò innesca una ricarica nei client, che verrà magicamente aggiornata. Al momento, lo sto facendo sondando. Tuttavia, quando tutto funziona, posso usare cose come WS o Socket.io per rendere le cose ancora più veloci.

PROBLEMA: ogni scheda riceve la notifica. Anche la scheda che l'ha istigata in primo luogo! (di conseguenza, una schermata già aggiornata viene aggiornata)

In qualche modo ho bisogno del server per conoscere l'ID della scheda della scheda che effettua la richiesta. Ricorda che un utente potrebbe avere 5 schede aperte: se cambiano XYZ, tutte le schede dovrebbero ricevere la notifica, TRANNE quella che l'ha effettivamente attivata!

Al momento, sto passando l'ID dell'area di lavoro per ogni richiesta Ajax (un utente potrebbe essere connesso e avere accesso a più aree di lavoro contemporaneamente).

  • Soluzione 1: aggiungere due ID di lavoro e scheda ID per ogni richiesta
  • Soluzione 2: utilizzare solo la scheda ID per ogni richiesta. L'app elabora l'ID dell'area di lavoro dal tabID (che conosce a quale area di lavoro appartiene)
  • Soluzione 3: ????? (Qualcosa che mi manca?)

Qualche idea?

+2

Non vedo alcun problema con soluzione 1 o soluzione 2. Per la soluzione 1 le richieste di ajax sarebbero la cosa che richiede più tempo, l'invio di un valore aggiuntivo non farebbe molta differenza. Anche la soluzione 2 va bene, interpreterete i dati inviati sul server. Personalmente, vorrei andare con la soluzione 2. Vorrei anche assicurarvi di proteggere le vostre richieste Ajax (probabilmente un ID di tabulazione cifrata e una chiave segreta) e confrontarlo sul lato server una volta inviata la richiesta –

+0

Il problema con la Soluzione 2 è che un La chiamata Ajax effettuata da una scheda "scaduta" avrà esito negativo poiché la scheda non è più attiva. Questo ha effetti collaterali "interessanti" (vedi: sospendi il tuo PC, aprilo di nuovo, invia quel modulo ... e no, non funzionerà).Almeno con la Soluzione 1 la chiamata può effettivamente funzionare (anche se il programma riceverà la notifica della modifica ...) – Merc

risposta

2

Anziché avere il server preoccupato di quali schede inviare notifiche di modifica, è possibile che la scheda che ha avviato le modifiche ignori la notifica.

due modi per farlo venire in mente:

  • Dopo aver modificato il contenuto di una scheda sarà Ingore tutte le notifiche per un breve periodo di tempo. (Funzionerà correttamente a meno che le modifiche su più schede avvengano in un breve lasso di tempo.)
  • Fare in modo che la scheda crei un "id di modifica" che invia al server con le modifiche a xyz. La notifica di cambio di trasmissione contiene questo ID e la scheda di invio lo riconosce come quello che ha inviato e lo ignora.
+0

+1 per la seconda opzione! – 11684

+0

La seconda opzione funziona bene finché il client avvia una "richiesta di trasmissione". Tuttavia, il client potrebbe avviare un'operazione completamente non correlata e il * server * potrebbe voler attivare il messaggio per tutte le schede connesse, tranne quella che ha apportato la modifica in primo luogo. Immagino che potrei avere un ID di operazione, un po 'dovrei ricordare di averlo per _each_ richiesta. – Merc

0

Si potrebbe sperimentare con HTML5 Visibility API con un ripiego per window.onfocus & window.onblur eventi e sopprimere l'aggiornamento della pagina, se è attualmente visibile/attivo.

+0

Sto ottenendo un '404' lì –

+0

@AdamLynch corretto – pawel

+0

Come procederesti nel recuperare gli aggiornamenti persi mentre la pagina era inattiva? Questo potrebbe diventare davvero brutto quando il cliente pensa che la pagina sia in un altro stato rispetto al server ... – 11684

Problemi correlati