Идеи по созданию уникального имени объекта javascript в ASP.Net?

StackOverflow https://stackoverflow.com/questions/405901

Вопрос

Я создал пользовательский элемент управления 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 уникальным, используя какую-то концепцию, с которой я еще не сталкивался.Идеи?

Спасибо,

Крейг

Это было полезно?

Решение

Ваш 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, независимо от того, сколько экземпляров вашего элемента управления добавлено на страницу.

Другие советы

Если это всего лишь одно значение, почему бы функции не принять его в качестве параметра и не построить обработчик 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.

Отличное решение, Антон.Другие предложенные решения были не менее хороши, и я рассматривал их, но искал что-то более элегантное, вроде этого решения.Спасибо!

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top