Я сталкиваюсь с некоторой неловкой проблемой. У меня есть веб-страница с несколькими кнопками, которые нужно отключить и включить в разных точках. Теперь, если бы это был Swing (или любой другой интерфейс пользовательского интерфейса рабочего стола), это было бы довольно тривиально: я бы просто добавил слушателей для изменений модели, которые меня интересовали, и соответственно обновил бы пользовательский интерфейс.
Это действительно базовые вещи MVC.
Дело в том, что я немного растерялся относительно того, как хорошо справиться с этим в Javascript. Я иду по маршруту, который в конечном итоге будет содержать какой-то настоящий спагетти-код, где прослушиватели щелчков для кнопок обновляют элементы управления пользовательского интерфейса, и это просто не закончится хорошо.
РЕДАКТИРОВАТЬ: Позвольте мне привести более конкретный пример.
Пример
Представьте себе экран со списком открытых ордеров. Эти заказы представлены в таблице, так как каждая строка (заказ) имеет несколько атрибутов, например, кто в настоящее время управляет заказом, кто сделал заказ, для чего он нужен, когда был сделан заказ и статус заказа.
Я сделал это, чтобы вы могли выбрать один (или несколько) из этих заказов, щелкнув по строкам. Это добавляет «выбранный» класс, который изменяет стиль, почти как список.
Что касается поведения, если пользователь выбирает один ордер, становятся доступными определенные действия, такие как «Открыть ордер» (для просмотра деталей), «Взять на себя ответственность», «Отмена» и т. Д. Атрибуты заказа также могут влиять на то, какие действия доступны, например, если заказ уже принадлежит кому-то другому, некоторые действия будут отключены.
Некоторые из этих параметров (например, открытие ордера) недоступны, если вы выбрали несколько ордеров.
Дополнительно через фоновый вызов Ajax список периодически обновляется новыми заказами. Пользователь также может нажать «Обновить» или отфильтровать заказы (по имени, диапазону дат и т. Д.), А затем перезагрузить заказы. Во время перезагрузки ордеров некоторые кнопки отключаются.
Я собирался сделать второй пример, но я думаю, что он достаточно сложен, чтобы проиллюстрировать тип проблемы. Теперь я начал это, давая различные классы управления. Например, элементы с классом «select» могут быть отключены / включены / стилизованы при выборе элемента.
Теперь это работает достаточно хорошо в простых случаях, но я сталкиваюсь с проблемами, когда состояние элемента управления зависит от множества условий. Также классы ломаются из-за того, что некоторые элементы хотят стилизоваться, некоторые элементы управления хотят быть отключенными / включенными, а в некоторых случаях должны происходить обе вещи.
В Swing я имел тенденцию обрабатывать подобные вещи, используя некий метод updateUI (), который вызывался бы всякий раз, когда изменялось состояние соответствующего элемента управления или модели. Затем он явно установит состояние всех элементов управления. Сейчас это, возможно, не самый эффективный способ (например, если у вас есть 30 элементов управления и вам нужно обновить только один из них, это немного напрасно), но я обнаружил, что простота того стоила. Альтернатива заключалась в том, что элементы управления / модели в конечном итоге были слишком информированы о том, от каких элементов управления они зависели или от каких элементов. Это идет с точки зрения связи.
Но у меня нет такого (очевидного) механизма в Javascript. Ненавязчивый Javascript, поддерживаемый jQuery, хорош, потому что он предотвращает засорение случайных фрагментов кода по всему коду. Но мне нужно пойти еще дальше, и у меня не будет некоторого способа справиться со сложностью этого (потому что это довольно сложный экран, и он будет только более сложным).