Domanda

Ho creato un controllo utente ASP.Net che verrà inserito più di una volta all'interno della pagina Web. In questo controllo ho definito un oggetto javascript come:

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

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

Nel codice dietro ho creato MyObject in uno script di avvio -

var opts = { x: 99 };

var myObject = new MyObject( opts );

Quando viene premuto un determinato pulsante nel controllo, chiamerà myObject.someFunction (). Ora diciamo che il valore di x sarà 99 per un controllo ma 98 per un altro controllo. Il problema qui è che var myObject verrà ripetuto e solo l'ultima istanza avrà importanza. Sicuramente c'è un modo per rendere unico var myObject usando alcuni concetti che non ho ancora incontrato. Idee?

Grazie,

Craig

È stato utile?

Soluzione

Il tuo Javascript è così: -

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]; }

Il tuo javascript di avvio in questo modo: -

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

Altro codice che deve utilizzare un'istanza (ad esempio nell'evento onclick sul lato client)

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

Nota il basso impatto sullo spazio dei nomi globale dei client, solo l'identificatore MyObject viene aggiunto allo spazio dei nomi globale, indipendentemente dal numero di istanze del tuo controllo aggiunte alla pagina.

Altri suggerimenti

Se è solo un valore, perché non avere la funzione prenderlo come parametro e creare il gestore onclick in modo che inserisca il valore corretto per ogni controllo. Se è più complesso di quello, allora considera di rendere le opzioni un array e, per ogni controllo, inserisci le opzioni corrette nel punto dell'array che corrisponde a ciascun controllo particolare. Quindi passare l'indice corretto nell'array nella funzione.

Lo faccio usando ScriptManager.RegisterClientScriptBlock per registrare una stringa come blocco JavaScript sul lato client. Posso quindi modificare la mia stringa di script usando {0}, {1} .., {n} segnaposto per inserire gli ID necessari. Dipende dalla struttura del tuo codice se questa è la moda più elegante, ma funziona in un attimo. È quindi possibile inserire nomi di variabili utilizzando i riferimenti a Me.ClientID.

Puoi impostare il valore di " x " statico e accedervi ovunque nel codice, ad esempio:

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

In questo modo è possibile accedere a MyObject.x in qualsiasi punto del codice, anche senza reinstallare MyObject.

Ottima soluzione Anthony. Le altre soluzioni offerte erano altrettanto valide e le ho considerate ma cercavo qualcosa di un po 'più elegante come questa soluzione. Grazie!

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top