В картографическом приложении, организованном с помощью Backbone, в основном представлении отображаются пути на карте. Этому представлению нужны данные, которые оно извлекает с сервера при первой загрузке, что занимает время (~ 500 мс).
Каждый путь имеет уникальный URL-адрес, настроенный с помощью route/navigate.
Когда пользователь щелкает внешнюю ссылку этого URL-адреса и попадает в приложение, представление карты не может сразу отобразить путь; сначала нужно получить данные.
Я настроил довольно сложный/запутанный процесс, чтобы сделать это (описано ниже), но мне интересно, есть ли лучший/канонический способ сделать это?
Вот мое решение до сих пор:
- In general
- there is a global "View" called "dispatch" that is not really a view, but is used to store the state of the various other views
- когда готово, представление карты запускает событие для отправки, так что оно знает, что карта готова («mapIsReady»)
- Upon loading a new url
- on a new url, the route object updates the model immediately, and then triggers an event to dispatch, saying in essence "update the path when possible"
- после получения этого сообщения диспетчер отслеживает состояние представления карты (которое он хранит сам) с помощью setTimeout
- когда представление карты готово, диспетчер запускает событие «обновить» в модели, которое указывает каждому представлению показать его.
Преимущества
- оно работает!
- представления не вызывают методы друг друга напрямую, все делается через события
Ограничения
- диспетчерский "вид" на самом деле вообще не вид
- цепочка событий может быть немного сложной для отслеживания... и для отладки в будущем
- setTimeout не кажется правильным
Изменить: или, может быть, моя проблема в том, что я хочу синхронизировать все на странице, а не должен. На странице есть три представления, которые отображают одну и ту же информацию по-разному, и только представление карты имеет проблему с необходимостью данных для отображения.
Таким образом, это проблема представления карты, а не всех остальных, и поэтому, возможно, правильный подход состоит в том, чтобы все эти диспетчерские операции происходили внутри представления карты, а другие представления выполняли свою работу, как только они могли...?