Идеи по созданию уникального имени объекта JavaScript в ASP.Net? - PullRequest
0 голосов
/ 02 января 2009

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

Спасибо

Craig

Ответы [ 5 ]

1 голос
/ 02 января 2009

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

0 голосов
/ 02 января 2009

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

0 голосов
/ 02 января 2009

Я делаю это с помощью ScriptManager.RegisterClientScriptBlock, чтобы зарегистрировать строку как блок JavaScript на стороне клиента. Затем я могу изменить строку сценария, используя {0}, {1} .., {n}, чтобы вставить необходимые идентификаторы. Это зависит от структуры вашего кода относительно того, является ли это наиболее элегантным способом, но это работает в крайнем случае. Затем вы можете ввести имена переменных, используя ссылки на Me.ClientID.

0 голосов
/ 02 января 2009

Вы можете сделать значение "x" статическим и получить к нему доступ в любом месте кода, например:

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

Таким образом, вы можете получить доступ к MyObject.x в любом месте вашего кода, даже без повторного создания экземпляра MyObject.

0 голосов
/ 02 января 2009

Если это только одно значение, почему бы не сделать так, чтобы функция взяла его в качестве параметра и создала обработчик onclick, чтобы он вставлял правильное значение для каждого элемента управления. Если он более сложный, чем это, рассмотрите возможность сделать опции массивом и, для каждого элемента управления, вставьте правильные опции в то место в массиве, которое соответствует каждому конкретному элементу управления. Затем передайте правильный индекс в массив в функцию.

...