Я создал пользовательский элемент управления ASP.Net, который будет размещаться на веб-странице более одного раза. В этом элементе управления я определил объект javascript, например:
function MyObject( options )
{
this.x = options.x;
}
MyObject.prototype.someFunction=function someFunctionF()
{
return this.x + 1;
}
В коде позади я создал MyObject в сценарии запуска -
var opts = { x: 99 };
var myObject = new MyObject( opts );
При нажатии определенной кнопки в элементе управления вызывается myObject.someFunction (). Теперь предположим, что значение x будет 99 для одного элемента управления, но 98 для другого элемента управления. Проблема здесь в том, что var myObject будет повторяться, и только последний экземпляр будет иметь значение. Конечно, есть способ сделать var myObject уникальным, используя концепцию, с которой я еще не сталкивался. Идеи?
Спасибо,
Крейг





Если это всего лишь одно значение, почему бы не сделать так, чтобы функция приняла его как параметр и построила обработчик onclick, чтобы он вставлял правильное значение для каждого элемента управления. Если это более сложно, рассмотрите возможность создания параметров в виде массива и для каждого элемента управления вставьте правильные параметры в то место в массиве, которое соответствует каждому конкретному элементу управления. Затем передайте в функцию правильный индекс массива.
Я делаю это, используя ScriptManager.RegisterClientScriptBlock для регистрации строки как блока JavaScript на стороне клиента. Затем я могу изменить строку сценария, используя заполнители {0}, {1} .., {n}, чтобы ввести необходимые идентификаторы. Это зависит от структуры вашего кода, если это самый элегантный способ, но он работает в крайнем случае. Затем вы можете ввести имена переменных, используя ссылки на Me.ClientID.
Вы можете сделать значение «x» статическим и получить к нему доступ в любом месте кода, например:
function MyObject( options ) { MyObject.x = options.x; }
MyObject.x = 99; // static
MyObject.prototype.someFunction = function () { return MyObject.x + 1; }
Таким образом, вы можете получить доступ к MyObject.x в любом месте вашего кода, даже без повторного создания экземпляра MyObject.
Ваш Javascript такой: -
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]; }
Ваш запускаемый javascript выглядит так: -
MyObject.create(ClientID, {x: 99});
Другой код, который должен использовать экземпляр (скажем, в событии onclick на стороне клиента)
String.Format("onclick=\"MyObject.getInstance('{0}').someFunction()\", ClientID);
Обратите внимание на незначительное влияние на глобальное пространство имен клиентов, в глобальное пространство имен добавляется только идентификатор MyObject, независимо от того, сколько экземпляров вашего элемента управления добавлено на страницу.
Отличное решение Энтони. Другие предлагаемые решения были столь же хороши, и я рассматривал их, но я искал что-то более элегантное, как это решение. Спасибо!