Pregunta

He creado un control de usuario ASP.Net que se colocará más de una vez dentro de la página web. En este control, he definido un objeto javascript como:

function MyObject( options )
{
  this.x = options.x;
}

MyObject.prototype.someFunction=function someFunctionF()
{
  return this.x + 1;
}

En el código detrás, he creado MyObject en un script de inicio:

var opts = { x: 99 };

var myObject = new MyObject( opts );

Cuando se presiona un cierto botón en el control, llamará a myObject.someFunction (). Ahora digamos que el valor de x será 99 para un control pero 98 para otro control. El problema aquí es que var myObject se repetirá y solo importará la última instancia. Seguramente hay una manera de hacer que var myObject sea único utilizando algún concepto que aún no he encontrado. Ideas?

Gracias,

Craig

¿Fue útil?

Solución

Su Javascript como este:

function MyObject(options) { this.x = options.x; }
MyObject.prototype.someFunction = function() { return this.x + 1; }
MyObject.create(id, options) {
    if (!this._instances) this._instances = {};
    return this._instances[id] = new MyObject(options);
}
MyObject.getInstance(id) { return this._instances[id]; }

Su javascript de inicio como este:

MyObject.create(ClientID, {x: 99});

Otro código que necesita usar una instancia (digamos en el evento onclick del lado del cliente)

String.Format("onclick=\"MyObject.getInstance('{0}').someFunction()\", ClientID);

Tenga en cuenta el bajo impacto en el espacio de nombres global de los clientes, solo se agrega el identificador MyObject al espacio de nombres global, independientemente de cuántas instancias de su control se agreguen a la página.

Otros consejos

Si es solo un valor, ¿por qué no hacer que la función lo tome como parámetro y cree su controlador onclick para que ponga el valor correcto para cada control? Si es más complejo que eso, considere hacer de las opciones una matriz y, para cada control, inserte las opciones correctas en el lugar de la matriz que corresponde a cada control en particular. Luego, pase el índice adecuado en la matriz a la función.

Hago esto usando ScriptManager.RegisterClientScriptBlock para registrar una cadena como un bloque de JavaScript en el lado del cliente. Luego puedo modificar mi cadena de script usando {0}, {1} .., {n} marcadores de posición para inyectar los identificadores necesarios. Depende de la estructura de su código en cuanto a si esta es la moda más elegante, pero funciona en un apuro. Luego podría inyectar nombres de variables utilizando referencias a Me.ClientID.

Puede hacer que el valor de " x " estático y acceda a él en cualquier parte del código, como:

function MyObject( options ) { MyObject.x = options.x; }
MyObject.x = 99; // static
MyObject.prototype.someFunction = function () { return MyObject.x + 1; }

De esta manera puede acceder a MyObject.x en cualquier parte de su código, incluso sin volver a instanciar MyObject.

Excelente solución Anthony. Las otras soluciones ofrecidas eran tan buenas y las consideré, pero estaba buscando algo un poco más elegante como esta solución. Gracias!

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top