2009-02-18 22 views
6

Incluyo un archivo JS en un control de usuario. La página de host tiene múltiples instancias del control de usuario.Múltiples controles de usuario y javascript

El archivo JS tiene una variable global que se utiliza como indicador para una función JS. Necesito que el alcance de esta variable esté restringido al control del usuario. Lamentablemente, cuando tengo varias instancias del control, el valor de la variable se sobrescribe.

¿Cuál es el enfoque recomendado en una situación como esta?

Respuesta

2

Recomendaría la refacturación de su código para que toda la lógica JS común se almacene en un solo lugar, no en cada UserControl. Esto reducirá el tamaño de su página por un buen margen.

Puede pasar la identificación de UserControl a los métodos comunes de JS para diferenciar entre UserControls.

Por la cuestión de limitar el alcance de su variable 'UserControl', podría almacenar algún tipo de estructura clave/valor para mantener su valor específico de UserControl - la clave sería la ID del cliente UserControl, y el valor sería la variable que te interesa

Por ejemplo:

var UCFlags = new Object(); 
//set the flag for UserControl1: 
UCFlags["UC1"] = true; 
//set the flag for UserControl2: 
UCFlags["UC2"] = false; 

Para acceder a ellos, sólo tiene que pasar el ClientID del control de usuario en el que la matriz UCFlags:

myFlag = UCFlags["UC1"]; 

En el lado del servidor, puede reemplazar la constante cuerdas "UC1" o "UC2" con

<%= this.ClientID %> 

así:

myFlag = UCFlags["<%= this.ClientID %>"]; 

Puede seguir utilizando la sintaxis <% = this.ClientID%> aquí aunque la mayor parte de JS se encuentre en un archivo separado; simplemente configure

UCFlags["<%= this.ClientID %>"] = value; 

antes de la llamada para incrustar el archivo JS.

+0

Ryan: puedo tener cualquier número de controles de usuario en la página. Por lo tanto, no puedo crear la matriz de UCFlags de manera determinista. UCFlags ["UC1"] = verdadero; UCFlags ["UC2"] = falso; .. .. .. UCFlags ["UCn"] = falso; –

+0

@Bob: lo entiendo, pero con este método no necesita saber qué UC y cuántas UCS hay, simplemente diciendo UCFlags ["<% = this.ClientID%>"] = true creará una propiedad (dot ClientID) en el objeto UCFlags e inicializar el valor a 'verdadero'. –

+0

Ah, veo que estás usando tablas hash en javascript. Parecía una matriz la primera vez que lo vi :) Gracias –

5

Algunas opciones son para generar dinámicamente el javascript basado en el ClientId del Control de usuario. Podría generar dinámicamente la variable global, por ejemplo.

Otra opción y una que recomendaría es encapsular la variable global y la función dentro de un objeto, su control de usuario puede emitir el JS para crear una instancia de ese objeto (que se puede nombrar dinámicamente permitiendo que alcance el objeto como veas conveniente).

Editar

no tengo un ejemplo de código de trabajo que puedo compartir, pero, he hecho esto en un par de maneras diferentes. el método más fácil es hacer esto en el marcado de su control de usuario.

<script language='javascript'> 
    var <%=this.ClientID%>myObject=new myObject(); 
</script> 

Asumiendo que su control tiene un clientId de myControl Esto creará un myControlmyObject variable.

Otra forma de hacer esto sería generar la secuencia de comandos en el código que se encuentra detrás, puede registrarlo usando: Page.ClientScript.RegisterStartupScript().

+0

Josh - Me gusta su enfoque recomendado. ¿Tiene una muestra de código? –

+0

@Bob: vea mi respuesta para un ejemplo de código que muestra cómo encapsular la variable dentro de un objeto. –

+0

Josh - Esto es lo que entiendo que debo hacer: 1. Crear una clase en JS con todas las funciones que se comparten entre las UC 2. Crear una instancia de la clase como se muestra en el fragmento de código 3. Si llamo al Función JS utilizando myControlmyObject.FunctionA(), entonces el alcance estaría limitado a la UC? –

2

Bueno, si usted tiene que mantener con la solución actual, se podría cambiar el nombre de variable global a algo como el siguiente código, que debe estar en el archivo .ascx de su mando:

<script type='text/javascript'> 
var <%= this.ClientID %>_name_of_global_variable; 
</script> 

Donde " este "es el control asp.net. De esta forma, cada control tiene un nombre de variable único, basado en la identificación del cliente. Asegúrese de actualizar el resto de su javascript para usar esta nueva convención de nomenclatura. El problema parece desordenado y los nombres de las variables serán muy largos dependiendo de dónde esté incrustado el control en la página.

¿Tiene sentido? Debería tomar una modificación mínima de JavaScript para que funcione.

+0

El JS está en un archivo separado y no puedo usar el <%= %> para insertar el ID de cliente –

+0

El concepto puede ser el mismo, si registra el javascript en su código subyacente para ese control. – Carl

+0

(Registre solo la declaración de la variable global en el código subyacente, es decir) – Carl

Cuestiones relacionadas