Как вы справляетесь с присоединением JavaScript к UserControls в ASP.NET и сохраняете изолированность нескольких экземпляров?

Допустим, вам нужно присоединить некоторые функции JavaScript к пользовательскому элементу управления ASP.NET, который может быть несколько экземпляров на любой данной странице. Поскольку JavaScript имеет общее глобальное состояние, какие методы вы можете использовать, чтобы сохранить состояние и поведение клиента отдельно для каждого экземпляра элемента управления?

Вы уверены, что вам не нужен рефакторинг? Не могли бы вы предоставить код?

netadictos 02.12.2008 01:18
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
1
734
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Ответ принят как подходящий

Что ж, главное, что вы можете сделать, это убедиться, что ваши функции JavaScript достаточно абстрактны и не связаны с конкретными экземплярами элементов управления HTML - пусть они принимают параметры, которые позволяют вам передавать различные экземпляры объектов.

JavaScript, который делает все, что вам нужно, должен существовать на вашей странице только один раз, независимо от того, сколько экземпляров пользовательского элемента управления у вас есть на данной странице, поэтому ваши функции должны игнорировать этот факт.

Без дополнительной информации о том, что вы пытаетесь сделать, я мало что могу предложить в качестве помощи; это будет зависеть от ваших обстоятельств.


Обновлено: Один из способов, которым я справился с конкретными аспектами этой проблемы, - это создать статическое свойство в пользовательском элементе управления (таким образом, это одна и та же переменная в нескольких экземплярах), которое отслеживает идентификаторы на стороне клиента различных элементов пользовательского элемента управления (пользователь control добавляет идентификаторы клиентов в этот список в событии контроль OnLoad); затем, в событии страницы OnPreRender (IIRC), отобразите их в переменной JavaScript, которую мой код знает, чтобы искать на клиенте и работать с ней. Не знаю, имеет ли это смысл, но может кому-то помочь ...

function <%=this.ClientID %>_myButton_onclick()
{
    DoSomething();
}

и

<button id = "myButton" onclick = "<%=this.ClientID %>_myButton_onclick()">

Обратите внимание, что в этом случае элемент управления является обычным элементом управления HTML.

Основная проблема с этим кодом заключается в том, что теперь у нас есть куча функций-оберток, загрязняющих глобальное пространство имен - есть и другие проблемы, такие как тот факт, что это слишком похоже на ужасный встроенный код, похожий на классический ASP ... :) Но это вопрос предпочтений, не так уж плохо ...

Jason Bunting 02.12.2008 01:57

Это может быть некрасиво, но он отвечает на вопрос ... Я предпочитаю использовать подход «сделать функции javascript универсальными и передать все», но для простых элементов управления это сработает.

Andrew Rollings 02.12.2008 02:39

@ Джейсон, изначально я подошел к этому так же в вашем ответе. Но, как и вы, я столкнулся с проблемой «как получить связанные элементы управления». Я думал о хранении связанных идентификаторов, как и вы, но чувствовал, что описанный выше подход самодостаточен и очевиден для обслуживания. Разработчики.

John MacIntyre 02.12.2008 16:15

@Jason, Приведенный выше код также упрощает добавление обработчиков событий js и управление ими, поэтому вместо DoSomething () у вас будет <% = this.Attributes ["ControlClickEvent"]%>. Я ожидал, что основная часть кода будет во внешнем файле js ... это просто простая поддержка segway в него.

John MacIntyre 02.12.2008 16:19

Я понимаю компромиссы, и их стоит рассмотреть, однако, как мне кажется, следует избегать загрязнения глобального пространства имен. Не только это, но я действительно не думаю, что метод, который я предлагаю, действительно сложнее поддерживать. Каждому свое!

Jason Bunting 02.12.2008 19:06

@ Джейсон, я согласен с тобой больше, чем ты думаешь. По большей части это просто другой подход.

John MacIntyre 02.12.2008 19:23

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

 this.Page.ClientScript.RegisterClientScriptInclude("searchcontrol.js","includes/searchcontrol.js");

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