GWT Handlers: лучше иметь много или одного?Лучше оставить их неактивными или отменить их регистрацию? - PullRequest
0 голосов
/ 02 июля 2010

Давайте предположим, что у меня есть приложение GWT со многими экземплярами Label (скажем, сотни из них) и Button.Когда пользователь нажимает на Button, мое приложение выполняет следующие действия:

  • подсвечивает каждый Label, делая цвет фона зеленым;
  • , когда пользователь перемещает мышьвыделенный Label, его фон становится темно-зеленым, а шрифт становится белым;
  • , когда пользователь перемещает мышь из выделенного Label, его фон становится зеленым, а шрифт становится черным;
  • когда пользователь нажимает на выделенный Label, каждый Label возвращается к исходному виду (т. Е. До того, как пользователь нажал на Button).

ВДля достижения вышеуказанного поведения мне нужно зарегистрировать MouseOverHandler, MouseOutHandler и ClickHandler для каждого Label.

Допустим, у меня есть класс MyHandler, реализующий все 3 обработчика.С точки зрения производительности, что лучше?

  • имеет один экземпляр MyHandler и регистрирует его как MouseOverHandler, MouseOutHandler и ClickHandler для каждого Label
  • зарегистрировать новый экземпляр MyHandler как MouseOverHandler, MouseOutHandler и ClickHandler для каждого Label

Более того, после того, как пользователь нажал на выделенный Label,Меня больше не интересуют MouseOverEvent, MouseOutEvent и ClickEvent из ярлыков.В этой ситуации лучше отменить регистрацию экземпляров MyHandler или оставить их зарегистрированными в следующий раз, когда пользователь нажмет Button?

Ответы [ 2 ]

4 голосов
/ 03 июля 2010

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

Тем не менее, то, что вы пытаетесь сделать, легко достижимо, хотя состояние CSS HOVER, без JavaScript ириски утечки памяти, если таковые имеются.

Вам просто нужно определить 3 класса CSS меток:

.label {
# define your general label style
}

.label-highlight {
    background-color: #< rgb for light green >;
    color: #< rgb for font color >;
}

.label-highlight:HOVER {
    background-color: #< rgb for dark green >;
    color: #< rgb for white font color >;
}

Установить метки с помощью класса стилей "label".

Вкл.Нажав кнопку, сделайте вызов addStyleDependentName ("highlight") на ярлыках, которые вы хотите выделить, и позвольте CSS управлять для вас состояниями наведения.

2 голосов
/ 02 июля 2010

Нет причин использовать разные обработчики, все они действуют одинаково. Просто используйте переданное событие, чтобы определить, с какой меткой взаимодействуете, и измените объект, переданный в это событие.

Ваш обработчик даже не должен знать, что существует несколько меток.

Когда они щелкают по нему, вы можете либо удалить его, как вы предлагаете, либо определить состояние "нажал" в начале вашего обработчика и просто вернуться (возможно, посмотрев на цвет).

Не беспокойтесь о производительности, разницу будет совершенно невозможно обнаружить, делайте то, что вам кажется более читаемым / поддерживаемым.

Лично я думаю, что оставил бы их зарегистрированными на случай, если захочу добавить больше поведения позже.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...