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

Foi útil?

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!

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top