Мы находимся в процессе реализации функции маркировки точно так же, как gmail для нашего веб-приложения - вы можете выбрать сообщения (флажки) и выбрать, какие ярлыки применить / удалить из выпадающего списка «ярлыков» (которые сами по себе являются набор флажков). Проблема в том, "как это сделать?" У меня есть решение, и перед тем, как я займусь этим, я хочу узнать, верен ли он и можно ли его упростить, используя определенные конструкции jquery / javascript, о которых я мог не знать. Я пока не являюсь профессионалом JavaScript / jQuery. :)
Пусть:
M = {Набор сообщений}
N = {Набор меток}
M_N = отношение многие ко многим между M и N, то есть набор сообщений, которые имеют хотя бы одну метку из N
Вывод: При заданном наборе «выбранных» постов и наборе «выбранных» меток получить массив элементов для JSON со следующими значениями:
- Post_id, Label_id, действие {добавить, удалить}
Вот подход, который я предложил (наивный или оптимальный, я не знаю):
- Получить текущее количество выбранных сообщений: var selectionCount = 5 (скажем, 5 выбранных сообщений)
- Получите следующий набор данных для каждого элемента в выборке:
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", затем в выпадающем меню отображается "полный тик". Метки не в выбранном наборе просто не выбраны, но могут переключаться только на отметку или «нет», но не в частичное состояние (т. Е. Только вкл / выкл. У частичного тика, так сказать, три состояния: вкл / выкл / частичный)
Столбец 'newState' в основном соответствует выбранному. Действие вывода зависит от того, каким было предыдущее состояние (то есть currentStateToShow):
- Частично для галочки подразумевает добавление метки ко всем постам , у которых нет этой метки
- не отмечен, означает удаление этого ярлыка из всех сообщений
- частичное или нулевое подразумевает удаление только ярлыков из выбранных сообщений
- нет отметок означает добавить новый ярлык для всех сообщений
- частичное или частичное подразумевает игнорировать, т.е. без изменений .
Затем я могу перебрать этот набор и принять решение отправить следующие данные на сервер:
| Post_id | Label_id | Action |
| 99 | 4 | add |
| 23 | 10 | delete |
...
и т. Д.
Так в чем же проблема? Ну, это довольно сложно! Javascript на самом деле не имеет структуры данных карты (не так ли?), И это повлечет за собой слишком много последовательных итераций и проверяет каждую вещь, а затем имеет много if-else для определения значения newState.
Я не ищу "как это закодировать", но что я могу сделать, чтобы облегчить мою жизнь? Есть ли что-то, что я уже могу использовать? Правильна ли логика или она слишком запутанная? Любые предложения относительно того, как атаковать проблему или некоторые встроенные структуры данных (или внешнюю библиотеку), которые могут сделать вещи менее грубыми? Образцы кода: P?
Я работаю с javascript / jquery + AJAX и restlet / java / mysql и буду отправлять JSON-структуру данных для этого, но я, конечно, смущен этой проблемой. Это не выглядит так просто, как я первоначально думал (я имею в виду, я думал, что это «проще», чем то, с чем я сталкиваюсь сейчас):
Сначала я думал об отправке всех данных на сервер и выполнении всего этого на сервере. Но после получения подтверждения мне все еще нужно обновить внешний интерфейс аналогичным образом, поэтому я, так сказать, «вернулся на круги своя», так как мне пришлось бы повторить то же самое на внешнем интерфейсе, чтобы решить, какие ярлыки скрыть и что показать. Поэтому я подумал, что было бы лучше просто сделать все это на стороне клиента.
Я предполагаю, что это будет просто 100-150+ строк кода javascript / jquery, если можно так выразиться в моем «опыте», может быть, не совсем ... но вот почему я здесь: D
PS: я посмотрел этот пост и демонстрацию Как я могу реализовать средство выбора ярлыков в стиле gmail? Но эта демонстрация предназначена только для одного сообщения за раз, и это легко сделать.Моя проблема усугубляется из-за выбора, заданного этими частичными выборками и т. Д.,