Загадка выбора меток Gmail - есть ли лучший способ сделать это?

Мы находимся в процессе реализации функции маркировки, точно такой же, как gmail для нашего веб-приложения - вы можете выбрать сообщения (флажки) и выберите, какие метки применить / удалить из выпадающего списка «меток» (которые сами по себе являются набором флажков). Проблема в том, "как это сделать?" У меня есть решение, и прежде чем я займусь этим таким образом, я хочу узнать, правильный ли это путь и можно ли его упростить с помощью определенных конструкций jquery / javascript, о которых я мог не знать. Я еще ни в коем случае не являюсь профессионалом в области JavaScript / jQuery. :)

Пусть: M = {Набор сообщений} N = {Набор этикеток} M_N = отношение «многие ко многим» между M и N, то есть набор сообщений, которые имеют хотя бы одну метку из N

. Вывод: Учитывая набор «выбранных» сообщений и набор «выбранных» меток, получаем массив элементов для JSON со следующими значениями:

  • Post_id, Label_id, action {add, delete}

Вот подход, который я придумал (наивный или оптимальный, я не знаю):

  1. Получить текущий количество выбранных сообщений: var selectionCount = 5 (например, выбрано 5 сообщений)
  2. Захватить следующий набор данных для каждого элемента в выборке:
 Label_id | numberOfLabelsInSelection| currentStateToShow |   newState
      4   |            3             |    partialTick     |  ticked (add)
      10  |            5             |      ticked        |  none (delete)
      12  |            1             |    partialTick     |  partialTick (ignore)
      14  |            0             |       none         |  ticked (add)

В основном приведенная выше структура данных просто фиксирует условия отображения, например, 5 сообщения выбираются в целом, и только два имеют метку «x», тогда в списке меток должна отображаться «частичная отметка» в поле флажка, если все сообщения имеют метку «y», то в раскрывающемся списке отображается «полная отметка». Ярлыки, не входящие в выбранный набор, просто не выбраны, но могут переключаться только на отметку «галочка» или «нет», но не в частичное состояние (то есть только включение / выключение. PartialTick имеет три состояния, так сказать: включено / выключено / частично)

Столбец 'newState' - это в основном то, что было выбрано. Выходное действие основано на том, каким было предыдущее состояние (например, currentStateToShow):

  • partial to tick подразумевает добавление метки ко всем сообщениям , у которых эта метка не была отмечена
  • , отмеченная как none, подразумевает удаление этой метки из все сообщения
  • от частичного к отсутствию подразумевает удаление только ярлыков из выбранных сообщений
  • без отметок подразумевает добавление новых ярлыков ко всем сообщениям
  • от частичного к частичному подразумевает игнорирование, т.е. без изменений .

Затем я могу перебрать этот набор и решить отправить следующие данные на сервер:

| Post_id | Label_id | Action |
|   99    |     4    |   add  |
|   23    |    10    | delete |
 ...

и т. д.

Так в чем проблема? Ну это СОВЕРШЕННО СЛОЖНО !!! В Javascript на самом деле нет структуры данных карты (не так ли?), И это повлечет за собой слишком много последовательных итераций и проверку каждой вещи, а затем будет много if-else для определения значения newState.

I Я не ищу «как это кодировать», но что я могу сделать, чтобы облегчить себе жизнь? Есть ли что-то, что я уже могу использовать? Логика правильная или слишком запутанная? Есть ли предложения относительно того, как атаковать проблему или некоторые встроенные структуры данных (или внешнюю библиотеку), которые могут сделать вещи менее грубыми? Примеры кода: P?

Я работаю с javascript / jquery + AJAX и restlet / java / mysql и буду отправлять для этого структуру данных JSON, но я очень смущен этой проблемой. Это не выглядит так просто, как я изначально думал (я имею в виду, я думал, что это «проще», чем то, с чем я сейчас сталкиваюсь :)

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

Я предполагаю, что это будет 100-150+ строк кода javascript / jquery в соответствии с моим "опытом", так сказать, может быть отключено ... но именно поэтому я здесь: D

PS : Я просмотрел этот пост и демонстрацию Как я могу реализовать средство выбора ярлыков в стиле Gmail? Но эта демонстрация предназначена только для одного сообщения за раз, и это легко сделать.Моя проблема усугубляется из-за того, что набор выбран с этими частичными выборками и т. Д.

9
задан Community 23 May 2017 в 02:32
поделиться