Question

J'ai créé un contrôle utilisateur ASP.Net qui sera placé plusieurs fois dans la page Web. Dans ce contrôle, j'ai défini un objet javascript tel que:

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

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

Dans le code derrière, j'ai créé MyObject dans un script de démarrage -

var opts = { x: 99 };

var myObject = new MyObject( opts );

Lorsque vous appuyez sur un bouton du contrôle, il appelle myObject.someFunction (). Supposons maintenant que la valeur de x sera 99 pour un contrôle mais 98 pour un autre contrôle. Le problème ici est que la var myObject sera répétée et que seule la dernière instance importera. Il existe sûrement un moyen de rendre la var myObject unique en utilisant un concept que je n'ai pas encore rencontré. Des idées?

Merci,

Craig

Était-ce utile?

La solution

Votre Javascript ressemble à ceci: -

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

Votre javascript de démarrage ressemble à ceci: -

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

Autre code devant utiliser une instance (par exemple dans l'événement onclick côté client)

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

Notez le faible impact sur l'espace de noms global des clients. Seul l'identifiant MyObject est ajouté à l'espace de noms global, quel que soit le nombre d'instances de votre contrôle ajoutées à la page.

Autres conseils

S'il ne s'agit que d'une seule valeur, pourquoi ne pas demander à la fonction de la prendre en paramètre et de construire votre gestionnaire onclick de sorte qu'il insère la valeur correcte pour chaque contrôle. S'il est plus complexe que cela, envisagez de faire des options un tableau et, pour chaque contrôle, insérez les options correctes à l'emplacement du tableau correspondant à chaque contrôle. Ensuite, passez le bon index dans le tableau dans la fonction.

Je le fais en utilisant ScriptManager.RegisterClientScriptBlock pour enregistrer une chaîne en tant que bloc JavaScript du côté client. Je peux ensuite modifier ma chaîne de script en utilisant {0}, {1} .., {n} espaces réservés pour injecter les identifiants nécessaires. Cela dépend de la structure de votre code pour savoir si c'est la mode la plus élégante, mais cela fonctionne à la rigueur. Vous pouvez ensuite injecter des noms de variables en utilisant des références à Me.ClientID.

Vous pouvez attribuer la valeur à & x; x " statique et y accéder n'importe où dans le code, tel que:

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

De cette façon, vous pouvez accéder à MyObject.x n’importe où dans votre code, même sans ré-instancier MyObject.

Excellente solution Anthony. Les autres solutions proposées étaient aussi bonnes et je les ai envisagées, mais je recherchais quelque chose d'un peu plus élégant comme cette solution. Merci!

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top