Frage

Ich habe eine ASP.Net Benutzersteuerung geschaffen, die mehr als einmal in der Web-Seite platziert wird erhalten. Bei dieser Steuerung habe ich ein Javascript-Objekt definiert, wie:

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

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

Im Code hinter ich MyObject in einer Startup-Skript erstellt habe -

var opts = { x: 99 };

var myObject = new MyObject( opts );

Wenn eine bestimmte Taste in der Steuerung gedrückt wird, wird es nennen myObject.someFunction (). Jetzt kann sagen, der Wert von x 99 für eine Kontrolle sein wird, aber 98 für eine weitere Kontrolle. Das Problem hierbei ist, dass die var myObject wiederholt wird und nur die letzte Instanz wird Materie. Sicherlich ist es eine Möglichkeit, die var myObject einzigartig mit einigem Konzept zu machen, habe ich noch nicht laufen über. Ideen?

Danke,

Craig

War es hilfreich?

Lösung

Ihre Javascript wie folgt aus: -

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

Ihr Startup javascript wie folgt aus: -

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

Andere Code, der eine Instanz verwenden muss (sagen wir in der clientseitigen Onclick-Ereignis)

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

Beachten Sie die geringen Auswirkungen auf den Clients globaler Namensraum, nur die MyObject-Kennung zu dem globalen Namensraum hinzugefügt wird, unabhängig davon, wie viele Instanzen Ihrer Kontrolle sind in der Seite eingefügt.

Andere Tipps

Wenn es nur ein Wert ist, warum nicht die Funktion als Parameter nehmen und bauen Sie Ihren Onclick-Handler, so dass es den richtigen Wert legt in für jede Kontrolle. Wenn es komplexer als die ist, sollte dann Optionen Herstellung eine Reihe und für jede Steuer, legt die richtigen Optionen in die Stelle in der Anordnung, die zu jeder bestimmten Steuer entspricht. Dann passiert den richtigen Index in das Array in die Funktion.

Ich tue dies ScriptManager.RegisterClientScriptBlock unter Verwendung einer Zeichenfolge als JavaScript-Block auf der Client-Seite zu registrieren. Ich kann dann meinen Skript Zeichenfolge mit {0}, {1} ändern .., {n} Platzhalter notwendig ids zu injizieren. Es hängt von der Struktur des Codes zu, wenn dies die eleganteste Art und Weise, aber es funktioniert in einer Prise. Sie könnten dann Variablennamen injizieren Verweise auf Me.ClientID verwendet wird.

Sie können den Wert machen von „x“ statisch und greifen Sie überall im Code, wie zum Beispiel:

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

Auf diese Weise kann MyObject.x überall in Ihrem Code zugreifen kann, auch ohne erneute Instanziierung MyObject.

Ausgezeichnete Lösung Anthony. Die anderen Lösungen angeboten waren so gut, und ich habe sie betrachten, aber ich war auf der Suche nach etwas ein wenig mehr elegant wie dieser Lösung. Dank!

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top