2012-08-23 30 views
5

¿Cómo comunico correctamente los datos entre dos guiones?Comunicación entre scripts | Tres métodos

En este caso particular, tengo un elemento en una secuencia de comandos, pero quiero agregarlo en otra secuencia de comandos.

La manera más simple que pude hacer esto es mediante el uso del objeto de ventana global como intermediario.

Pero los globales no son la mejor práctica.

¿Cuál es la forma correcta de pasar este elemento a otro script?

Ambos guiones están encapsulados en el patrón del módulo.

Guión 0 Crear elemento de punto

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

Guión 1 Anexar elemento de punto

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 

}; 

Ambos están encapsulados en el diseño del módulo de

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

Respuesta

4

Todos los scripts JS se ejecutan en el ámbito global. Cuando los archivos se descargan al cliente, se analizan en el alcance global.

Así que si usted tiene

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

No hay nada que le para de esta manera:

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

Mientras File_1.js se carga antes File_2.js

Si son espacios de nombres, es decir: MYNAMESPACE = {}; y cada archivo extiende su espacio de nombres a través de módulos (en lugar de "patrón de módulo" que se refiere a las interfaces de retorno de las funciones de invocación inmediata), luego verificar la existencia del módulo.

Si ESTÁ escribiendo módulos para una aplicación de espacio de nombres, y SÍ necesita acceder a las variables de un módulo a otro, entonces debe proporcionar un interface para eso.

Si está SANDBOXING módulos, a continuación, es necesario proporcionar a todos una proxy similar a un service-locator o una "registry", o desarrollar un messaging-system basado en un mediator-pattern.

+0

Como mencioné, ambos scripts están encapsulados en el patrón del módulo ... –

+0

@HiroProtagonist No mencionó el *** qué patrón de módulo ***. ¿Estás hablando de 'módulo revelador', estás hablando de' espacios de nombres' o estás hablando de 'sandboxing'? Porque los tres tienen niveles de solución muy diferentes. Como no tenemos forma de saber cuál es, no tenemos forma de saber qué solución es la correcta. – Norguard

+1

muchas buenas palabras clave para mí para Google - gracias voy a investigar esto. –

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

De esta manera solo tiene un objeto global en lugar de varios.

+0

Estaba en el proceso de escribir lo mismo. Mi única recomendación sería verificar la existencia de 'window.sharedSpace' antes de declararlo, en el caso de que ya exista. – jackwanders

+0

¿Qué tal volver de un script e importarlo al otro ... podría ser mejor, como una forma de evitar los globales? –

+0

La parte 'de regreso' de la que hablas requerirá 'funciones' globales. Lo cual iría hacia atrás. –

1

¿Por qué no pasa el elemento a una función en el módulo?

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

Aún más simple, ¿por qué no exportar el elemento o un objeto, y luego importarlo usando la característica de importación global del patrón del módulo ... ambas formas funcionarían, creo. –

+0

@HiroProtagonist no estoy familiarizado con "importaciones globales" – jbabey

+0

en ti IIFE, el último '()' si pones un parámetro en su se llama 'importación global', es una optimización de simplemente usar variables en el alcance global, ahora se importan y se reduce la cadena de búsqueda de alcance. –