2012-08-23 15 views
5

Come comunicare correttamente i dati tra due script.Comunicazione tra script | Tre metodi

In questo caso particolare, ho un elemento in uno script, ma voglio aggiungerlo in un altro script.

Il modo più semplice per farlo è utilizzare l'oggetto finestra globale come intermediario.

Ma i globali non sono le migliori pratiche.

Qual è il modo corretto per passare questo elemento a un altro script?

Entrambi gli script sono incapsulati nel modello del modulo.

Script 0 Crea Elemento Point

var element = document.createElement("div"); 
element.innerHTML = response_text; 

Script 1 Append Elemento Point

Vi.sta = { 

    // implemented in the boot loader - shared global space - appended child already - you don't have to append until now. 
    // Static data has already been composed. 
    // Pull off window and append or best practice 

}; 

Entrambi sono incapsulati nel modello di modulo di

(function(){ 
    // the code here 
})() 

risposta

4

Tutti gli script JS vengono eseguiti nell'ambito globale. Quando i file vengono scaricati sul client, vengono analizzati nell'ambito globale.

Quindi, se hai

// File_1.js 
var myObj = { colour : "blue" }; 

Non c'è nulla ti impedisce di fare questo:

// File_2.js 
var otherObj = { colour : myObj.colour }; 

Finché viene caricato File_1.js prima File_2.js

Se sono namespaces, ovvero: MYNAMESPACE = {}; e ogni file estende il tuo spazio dei nomi attraverso i moduli (anziché "modello di modulo" che si riferisce all'interfaccia di ritorno da funzioni che invocano immediatamente), quindi controlla l'esistenza del modulo.

Se STI stai scrivendo moduli per un'app con nomi, e hai bisogno di accedere a variabili da un modulo a un altro, allora dovresti fornire un interface per quello.

Se siete SANDBOXING moduli, quindi è necessario fornire loro un proxy simile ad un service-locator o un "registry", o sviluppare un messaging-system sulla base di un mediator-pattern.

+0

Come ho già detto entrambi gli script sono incapsulati nel modello del modulo ... –

+0

@HiroProtagonist Non hai menzionato *** quale modello di modulo ***. Stai parlando di 'rivelating-module', stai parlando di' namespacing' o stai parlando di 'sandboxing'? Perché tutti e tre hanno livelli di soluzione molto diversi. Poiché non abbiamo assolutamente alcun modo di sapere quale sia, non abbiamo modo di sapere quale soluzione alternativa è corretta. – Norguard

+1

un sacco di buone parole chiave per me a Google - grazie esaminerò questo. –

5
window.sharedSpace = {}; 
sharedSpace.sharedValue = 'foo bar'; 

In questo modo si ha solo un oggetto globale anziché diversi.

+0

Ero in procinto di scrivere lo stesso. La mia unica raccomandazione sarebbe quella di verificare l'esistenza di 'window.sharedSpace' prima di dichiararlo, solo nella remota possibilità che esso esista già. – jackwanders

+0

Che dire del ritorno da uno script e dell'importazione nell'altro ... potrebbe essere meglio, come un modo per evitare i globali? –

+0

La parte "di ritorno" di cui parliamo richiederà funzioni globali. Quale sarebbe andare indietro. –

1

Perché non si passa semplicemente l'elemento a una funzione nel modulo?

var module1 = (function() { 
    return { 
     func1: function() { 
      // get your element 
      var someElement = ...; 

      // pass it to the other module 
      module2.func2(someElement); 
     } 
    }; 
})(); 

var module2 = (function() { 
    return { 
     func2: function (someElement) { 
      // do whatever you want with someElement 
     } 
    }; 
})(); 
+0

Ancora più semplice, perché non esportare l'elemento o un oggetto e quindi importarlo utilizzando la funzione di importazione globale del modello di modulo ... entrambi i modi funzionerebbero credo. –

+0

@HiroProtagonist non ho familiarità con "importazioni globali" – jbabey

+0

su di te IIFE, l'ultimo '()' se inserisci un parametro nel loro è chiamato 'importazione globale', è un'ottimizzazione semplicemente usando le variabili nel ambito globale, ora vengono importati e la ricerca dell'ottica catena viene ridotta. –