Ideias sobre como fazer um nome de objeto javascript único em ASP.Net?
-
03-07-2019 - |
Pergunta
Eu criei um controle de usuário ASP.Net que vai ficar colocado mais de uma vez dentro da página web. Neste controle eu defini um objeto javascript tais como:
function MyObject( options )
{
this.x = options.x;
}
MyObject.prototype.someFunction=function someFunctionF()
{
return this.x + 1;
}
No código por trás Criei MyObject em um script de inicialização -
var opts = { x: 99 };
var myObject = new MyObject( opts );
Quando um certo botão no controle é pressionado ele irá chamar myObject.someFunction (). Agora vamos dizer que o valor de x será de 99 para um controle, mas 98 para um outro controle. O problema aqui é que o var myObject será repetido e só a última instância importa. Certamente há uma maneira de fazer a var myObject única usando um conceito que eu não ter executado através de ainda. Ideias?
Obrigado,
Craig
Solução
Seu Javascript assim: -
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]; }
Seu javascript startup assim: -
MyObject.create(ClientID, {x: 99});
Outro código que precisa usar uma instância (dizer no lado do cliente o onclick evento)
String.Format("onclick=\"MyObject.getInstance('{0}').someFunction()\", ClientID);
Observe o baixo impacto sobre os clientes namespace global, apenas o identificador MyObject é adicionado ao namespace global, independentemente de quantas instâncias de seu controle são adicionados à página.
Outras dicas
Se é apenas um valor, porque não têm a função de tomá-lo como um parâmetro e construir o seu manipulador onclick para que ele coloca o valor correto no para cada controle. Se ele é mais complexo do que isso, em seguida, considerar a possibilidade de opções de uma matriz e, em cada controlo, inserir as opções correctas para o local na matriz correspondente a cada controlo especial. Em seguida, passe o índice adequado para a matriz para a função.
Eu faço isso usando ScriptManager.RegisterClientScriptBlock para registrar uma string como um bloco de JavaScript no lado do cliente. Posso, então, modificar o meu script string usando {0}, {1} .. {n} titulares lugar para injetar ids necessárias. Depende da estrutura do seu código como para se esta é a forma mais elegante, mas funciona em uma pitada. Você poderia, então injetar nomes de variáveis, utilizando referências a Me.ClientID.
Você pode fazer o valor de estática "x" e acessá-lo em qualquer lugar do código, tais como:
function MyObject( options ) { MyObject.x = options.x; }
MyObject.x = 99; // static
MyObject.prototype.someFunction = function () { return MyObject.x + 1; }
Desta forma, você pode acessar MyObject.x em qualquer lugar no seu código, mesmo sem MyObject instanciating re-.
Excelente solução Anthony. As outras soluções oferecidas eram tão bons e eu fiz considerá-los, mas eu estava procurando algo um pouco mais elegante como esta solução. Obrigado!