2011-03-15 7 views
5

Necesito poder determinar cuándo se crea un objeto (no un elemento DOM - un objeto javascript).¿Está atento a un evento de creación de propiedades?

An answer to this question tiene un código de aspecto muy útil para crear propiedades observables, por lo que puede hacer que una función se active cuando cambia una propiedad.

En mi situación, necesito hacer algo cuando se crea el objeto/propiedad, no una propiedad existente modificada, y mi comprensión limitada de tales asuntos no me ayudó a determinar si o cómo podría usar ese código para hacer esto. después de mucho entrecerrar los ojos.

La situación es la siguiente: la página carga un conjunto de scripts. Algunos de los guiones crear cosas que son necesarias otras secuencias de comandos, por ejemplo:

ThisStuff = (function() { 
    // blah blah 
    return self; 
}()); 

algún otro código necesario para inicializar este ThisStuff, siempre que esté disponible, que puede ser después de que el DOM se realiza la carga. El usuario en realidad no necesita ThisStuff de inmediato, por lo que está bien que suceda cada vez que se termina de cargar el script. Así que me gustaría hacer algo a lo largo de las líneas de:

$(document).ready(function() { 
    wheneverIsAvailable(window,'ThisStuff', function(object) { 
     object.init(args); 
    }) 
}); 

Sé que existen otras soluciones para este problema (cambiar el orden de secuencia de comandos o scripts de carga bajo demanda), pero esas son difíciles debido a la arquitectura. Entonces, solo estoy interesado en una forma de hacer esto frente a otras soluciones. Si jQuery ofrece alguna de esas funciones, también está bien mientras lo estoy usando.

Respuesta

2

Puede tener un setInterval comprobando varias veces por segundo para ver la variable específica. Puede verificar si se creó utilizando obj.hasOwnProperty(prop). Cuando se crea, invocas la función y borras el intervalo.

Podría estar sucio pero también podría funcionar bien para usted.

Editar: He codificado esto para usted: http://jsfiddle.net/jhXJ2/2/. También admite pasar argumentos adicionales a la función.

window.__intervals = []; 

function wheneverIsAvailable(obj, prop, func) { 
    var id = (Math.random()+"").substring(2); 
    var args = arguments; 
    window.__intervals[id] = window.setInterval(function() { 
     if(obj.hasOwnProperty(prop)) { 
      window.clearInterval(window.__intervals[id]); 
      func(Array.prototype.slice.call(args, 3)); 
      // Call function with additional parameters passed 
      // after func (from index 3 and on) 
     } 
    }, 1000/ 50); 
} 

wheneverIsAvailable(window, 'test', function() { 
    alert(arguments[0]); 
}, 'Woot!'); 

window.setTimeout('window.test = 123', 1000); 
+0

¿Cómo es que no me gusta esto? Desearía que hubiera una manera sin temporizador para hacerlo fácilmente, pero no es un gran problema. –

+0

@jamietre: Tampoco me gustan esos hacks, pero los temporizadores generalmente funcionan bien. Además, esto es bastante fácil en mi opinión. – pimvdb

+0

Para divertirme, en realidad lo escribí antes de actualizar esto con el código, está aquí: http://jsfiddle.net/hpw8Y/3/ .. en muchos aspectos similar, aunque no pude averiguar si el mío en realidad trabajo. Lo que no pude entender es, y haces esto con una matriz, ¿seguirá existiendo 'obj' en la mía cuando finalmente tenga éxito? Sin embargo, hay una mejora sobre la suya: no inicie el temporizador a menos que tenga que hacerlo :) –

0

Esto es un poco exagerado pero podría funcionar.

Tendría que utilizar knockoutjs, una biblioteca javascript. Es increíble, pero está hecho para un propósito ligeramente diferente.

De todos modos, tiene una función de dependiente observable que permite activar un evento cada vez que cambia un cierto valor. Ahora sé que quieres en la creación, pero puedes verificar si tu variable tiene algún valor (aparte de lo que proporcionaste inicialmente), si es así, considera que se debe inicializar.

Avísame si crees que esto parece viable.

Cuestiones relacionadas