В течение последних шести месяцев я работал с Backbone. Первые два месяца возились, изучали и выясняли, как я хочу структурировать свой код вокруг него. Следующие 4 месяца избивали производственное приложение. Не поймите меня неправильно, Backbone спас меня от многопользовательского беспорядка клиентского кода, который раньше был стандартом, но он позволил мне сделать больше грандиозных вещей за меньшее время, открыв полный новый стек проблем. По всем вопросам, которые я поднимаю здесь, есть простые решения, которые выглядят как хаки или просто ошибаются. Я обещаю награду в размере 300 очков за потрясающее решение. Здесь:
- Загрузка. Для нашего случая использования (панель администратора) пессимистическая синхронизация плохая. Для некоторых вещей мне нужно проверить действия на сервере, прежде чем принимать их. Мы начали, прежде чем событие sync было объединено с Backbone,
и мы использовали этот маленький код для имитации события загрузки:
window.old_sync = Backbone.sync
# Add a loading event to backbone.sync
Backbone.sync = (method, model, options) ->
old_sync(method, model, options)
model.trigger("loading")
Великий. Он работает так, как ожидалось, но это не кажется правильным. Мы привязываем это событие ко всем соответствующим представлениям и отображаем значок загрузки, пока мы не получим событие успеха или ошибки из этой модели. Есть ли лучший, более простой способ сделать это?
Теперь для жестких:
- Слишком много вещей слишком много делают.. Скажем, у нашего приложения есть вкладки. Каждая вкладка управляет коллекцией. С левой стороны вы получаете коллекцию. Вы щелкните модель, чтобы начать редактирование в центре. Вы меняете свое имя и нажимаете вкладку, чтобы перейти к следующему элементу формы. Теперь ваше приложение "в реальном времени что-то", которое замечает разницу, запускает проверки и автоматически синхронизирует изменения с сервером, не требуется кнопка сохранения! Отлично, но H2 в начале формы совпадает с именем на входе - вам нужно его обновить. О, и вам нужно обновить имя в списке в сторону. OH, и список сортируется по именам!
Вот еще один пример: вы хотите создать новый элемент в коллекции. Вы нажимаете кнопку "новый", и вы начинаете заполнять форму. Вы сразу добавляете элемент в коллекцию? Но что произойдет, если вы решите отказаться от него? Или если вы сохраните всю коллекцию на другой вкладке? И там есть загрузка файла. Вам нужно сохранить и синхронизировать модель, прежде чем вы сможете начать загрузку файла (чтобы вы могли прикрепить файл к модели). Итак, все начинается с дрожания: вы сохраняете модель и список, а форма снова отображается - теперь она синхронизируется, поэтому вы получаете новую кнопку удаления, и она отображается в списке, - но теперь загрузка файла завершена, поэтому все снова начинает рендеринг.
Добавить подвид в микс, и все начинает выглядеть как фильм Феллини.
-
Он находится на всем пути вниз - Вот хорошая статья об этом материале. Я не мог, ради любви ко всему, что свято, найти правильный способ подключить плагины jQuery или события DOM к любому представлению, имеющему subviews. Ад приходит незамедлительно. Всплывающие подсказки слышат, что рендер придет долго и начинает волноваться, subviews становятся похожими на зомби или не реагируют. Это основные моменты боли, так как здесь присутствуют настоящие ошибки, но у меня все еще нет всеобъемлющего решения.
-
Мерцание - рендеринг выполняется быстро. На самом деле, это так быстро, что мой экран выглядит так, будто у него был захват. Иногда это изображения, которые должны снова загружаться (с другим вызовом сервера!), Поэтому html минимизирует и затем снова резко увеличивается - ширина css + высота для этого элемента исправляет это. иногда мы можем решить это с помощью fadeIn и fadeOut - которые являются болью в заднице, потому что иногда мы повторно используем представление и иногда создаем его заново.
TL; DR. У меня проблемы с представлениями и подзаголовками в Backbone. Он отображает слишком много раз, он мерцает, когда он отображает, subviews отделяет мои события DOM и питает мои мозги.
Спасибо!
Более подробная информация: BackboneJS с Ruby on Rails Gem. Шаблоны с использованием шаблонов UnderscoreJS.