2010-09-09 12 views
11

Sto scrivendo un'applicazione JavaScript piuttosto complessa che ha un'architettura MVC che sto implementando utilizzando il supporto Class di Prototype e il modello Module. L'applicazione utilizza AJAX e il pattern Observer. Creo l'istanza del mio controller quando il DOM è stato caricato, lo passo una vista e alcuni modelli creati dai dati JSON e via.Le proprietà di impostazione sull'oggetto Window sono considerate pratiche errate?

Tuttavia, ho scoperto che devo impostare il mio esempio controller come una proprietà sulla Window oggetto — cioè dichiararla senza usare var — perché ho un successo di callback AJAX che rinfresca l'oggetto vista di proprietà del controllore e a questo punto del codice il mio piccolo mondo MVC non è nel campo di applicazione.

Ho esaminato il passaggio dell'oggetto vista come parametro alla funzione contenente il codice AJAX, ma questo è diventato molto caotico e avrebbe causato alcune orribili violazioni del pattern MVC, come l'accoppiamento del modello e della vista. E 'stato orrendo.

sta facendo le cose come la memorizzazione di mia istanza di controllo direttamente sul Window cattiva forma in considerazione? Ha un odore un po 'come usare una variabile globale per me, ma non riesco a vederlo da nessuna parte.

+0

Puoi pubblicare un esempio di codice piccolo? –

+0

Non posso aver paura. Sono a casa e il codice è al lavoro e, cosa più importante, penso che dovrei pubblicare una quantità significativa di codice per illustrare il punto: non mi piace leggere le domande sul "muro di testo", quindi non vorrei infliggerlo agli altri! –

+1

Perché l'MVC dovrebbe essere fuori portata? Non dovrebbe almeno catturare un riferimento in una chiusura dal tuo callback AJAX? – MooGoo

risposta

9

Impostazione delle proprietà per l'oggetto finestra equivale a creare variabili globali. Cioè, a volte farlo è inevitabile, ma dovresti cercare di mantenerlo al minimo, poiché finisce per inquinare lo spazio dei nomi globale.

Nel tuo caso, la creazione di una singola proprietà non è poi così male. Se si vuole essere molto attenti a questo proposito, è possibile creare in modo esplicito uno spazio dei nomi per qualsiasi roba è necessario un accesso globale a:

// In init: 
var mynamespace = {}; 

. . . 

// Once the controller is available: 
var namespace = window.mynamespace; 
namespace.controller = controller; 
namespace.foo = bar; // Set other stuff here as well. 
+0

Grazie. Per qualche ragione non avevo pensato di usare uno spazio dei nomi, anche se ne sto usando uno altrove. –

2

vorrei dire che è cattiva pratica. Puoi sempre, e facilmente, creare uno spazio dei nomi per la tua applicazione e inserire i globali lì, se necessario.

2

sono utili quando si desidera chiamare una funzione globale il cui nome non è noto in anticipo.

var funcName = "updateAns" + ansNum; 
window[funcName](); 

Essi possono essere utilizzati per a) evitare evals male nella maggior parte dei casi. b) evitare errori di riferimento a variabili globali.

x = x + 1 genererà un errore di riferimento se x globale non è definito. window.x = window.x + 1 non si

Problemi correlati