2011-03-12 17 views
6

¿Hay alguna forma en JavaScript de tener algo así como un evento que escucha los cambios en una variable? entonces, cuando se modifica su valor, el evento se dispara y luego puedo invocar una función. Para poner esto más en contexto, tengo una función que maneja la representación html de una matriz de objetos, y quiero que esa función sea llamada automáticamente cada vez que se modifica la matriz.¿Cómo ejecutar una función en JavaScript cada vez que cambia una variable?

Gracias.

+0

'setters' son 'ayudantes' que pueden analizar primero la variable que se va a establecer. No estoy seguro de qué posibilidades y qué nivel de control tiene sobre su código, pero en el colocador puede llamar a la función. – pimvdb

Respuesta

7

Uso object.watchdocs y si no es compatible de forma nativa mirar esta aplicación: Object.watch() for all browsers?

+1

Tenga en cuenta que el método de observación está en desuso: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/watch –

6

No creo que lo que pregunte es posible.

Una solución podría ser:

  • encapsular sus datos en un objeto específico de acceso
  • que los datos utilizando un método de selección de ese objeto
  • tienen que método setter tanto:
    • conjunto los datos
    • llame a su función

Pero requerirá que reescriba un poco su código.

+0

Esa es la manera más fácil de hacer esto, creo yo también. Tal vez algunos frameworks tengan capacidades como esa también. – Chris

1

Usted podría utilizar setInterval para comprobar su valor tantas veces por segundo, y guardarlo en una variable independiente. Puede verificar cada vez si la variable real es diferente de la otra. En ese caso, llame a la función.

Aunque es un truco sucio.

+0

+1 está sucio, como dices. Nada agradable. Pero sin otras opciones, en el escenario correcto, puede funcionar :) –

+0

um ... Supongo que esto funcionaría en aplicaciones más pequeñas si realmente quieres un código feo y potencialmente defectuoso ...porque todavía hay una pequeña ventana donde la variable es un valor "nuevo" pero la función no se ha ejecutado, lo que, supongo, crearía errores en ciertos escenarios. Este método, en general, no debería ser favorecido, si no pudiera decirlo, Sr./Ms. observador casual, que puede o no estar leyendo este comentario. Solo recomendaría crear un objeto como https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/prototype y usar las funciones getter/setter. – dylnmc

1

Dado que JavaScript no es compatible universalmente con los métodos setter/getter, le recomiendo que piense en cómo establecer las variables. Una técnica que podría funcionar es:

Array.prototype.setMember = function(index,newValue) { 
    alert("I will perform some action here"); 
    this[index] = newValue; 
} 

var myArray = [1,2,3]; 
// x[0] = 11; // Don't do this any more 
x.setMember(0,11); 
alert(x[0]); 

Yo personalmente no soy un gran fan de la adición de nuevos métodos para basar prototipos, pero hace las cosas más fáciles de refactorizar en el corto plazo.

+0

sí, probablemente sea más fácil y mejor que crear un objeto completamente nuevo si solo necesita hacer esto con una matriz, por ejemplo. Buen pensamiento – dylnmc

Cuestiones relacionadas