Магистральная маршрутизация, несколько маршрутизаторов после запуска базовой системы.

64
10

Поэтому у меня есть проблема.

Я в ситуации, когда мне нужно иметь несколько Backbone.Routers, которые обрабатывают свои собственные маршруты соответственно и т.д., И я динамически загружаю их на основе того, что в настоящий момент знает о маршруте основного маршрутизатора (Router 1 в следующем примере).

Основная проблема, с которой я сталкиваюсь, - это что-то вроде этого.

    Router1 загружает Backbone.history.start() Router1 загружает Router2 Router2 ничего не делает, потому что история уже началась

Есть ли какой-либо возможный способ заставить router2 смотреть на текущий фрагмент истории без потенциального вызова маршрутов в router1 снова?

IE не вручную вызывает Backbone.history.loadUrl(Backbone.history.getFragment());

Редактировать:

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

спросил(а) 2021-01-25T16:50:53+03:00 4 месяца, 4 недели назад
1
Решение
77

Я предлагаю вам взглянуть на MarionetteJS, который является отличной основой для создания составных приложений с Backbone. В частности, посмотрите исходный код примера приложения MarionetteJS. То, что он делает, - это разделить приложение на несколько подприложений. Каждое суб-приложение имеет свой собственный маршрутизатор, но все они определяют отдельные маршрутизаторы в родительском приложении. Когда родительское приложение инициализируется, все маршрутизаторы создаются, и только тогда вызывается Backbone.history.start(). Я понимаю, что этот ответ требует, чтобы вы погрузились в Marionette, у которого крутая кривая обучения, но я думаю, что это того стоит. Наверху мы построили всю архитектуру веб-приложения SOOMLA. Marionette зарекомендовала себя как отличное решение, когда вы хотите перерасти свой повторяющийся шаблонный шаблон. Престижность Derick Bailey для потрясающей рамки с открытым исходным кодом.

ответил(а) 2021-01-25T16:50:53+03:00 4 месяца, 4 недели назад
45

Не могли бы вы предоставить jsfiddle, который воспроизводит ваше дело? Потому что вы обычно можете это сделать (у меня есть приложение, создающее экземпляр маршрутизатора, запуск истории, создание нескольких других, и это отлично работает.)

До этого времени, вот некоторые сведения о маршрутизаторах:
- когда вы создаете экземпляр маршрутизатора, маршруты привязаны к Backbone.history (один уникальный объект)
- это означает, что вы не можете ожидать, что оба маршрутизатора будут выполнять обратный вызов
- это также означает, что существует фиксированный порядок: сначала будут проверены последние маршрутизируемые маршруты маршрутизатора

Редактировать:
Хорошо, я думаю, вы хотите, чтобы оба маршрута выполнялись, потому что вы ожидаете, что кто-то получит прямо в tab1/stuff.
Ужасный способ: вы можете остановить Backbone.history(Backbone.history.stop()) и запустить его сразу после этого, маршруты router2 будут связаны...
Другая возможность: почему бы вам не поместить все маршруты в основной маршрутизатор? Ну, я думаю, если у вас действительно слишком много таких понятных.
Последняя возможность (что я могу придумать): использовать тот факт, что первые маршруты маршрутизатора сначала проверяются, и что вам нужно. Измените маршруты основного маршрутизатора, добавьте общий, который поймает то, что вам нужно (например, tab1). Не делайте ничего, перейдите назад в /tab1. Подготовьте 2 навигации, например:

this.navigate('/tab1', {trigger: true});
this.once('someEvent', function() {
this.navigate('/tab1/stuff', {trigger: true});
});

Если у вас достаточно общих URL-адресов, вы можете заменить tab1 & stuff на аргументы, которые вы бы соответствовали вашему универсальному маршруту.

Изменить 2:
Хорошо, здесь редактирование, предполагающее все, что я написал в своем последнем комментарии, и что вы получаете доступ к представлениям Backbone с хэштегом (или URL), например view/action. Я постараюсь быть более основательным, каким я могу быть (потому что у меня все еще не все детали вашей проблемы).

Этот jsfiddle показывает принцип. Теперь все еще существует тот факт, что он будет конфликтовать с историей клиента (возможно, есть способ избежать этого в Backbone, я думаю, вам нужно будет изучить это, если это проблема для вас).

Теперь, что может быть несколько других проблем. Наименьший из них может быть шаблоном во вторичных маршрутизаторах (вам нужно поместить просмотр/перед любым маршрутом). Для этого есть решения, но это будет слишком глубоко. Чем больше:
Я уже сказал это, но только один маршрут будет согласован. Таким образом, ваш основной маршрутизатор CANT будет использоваться для рассмотрения того факта, что клиент изменит представления (например, перейдите из view1/action1 в view2/action2, ранее загруженный маршрутизатор2). Действие2 будет выполнено, но если вы перезагрузите свои представления в своем основном маршрутизаторе, это не будет сделано.
Как последний комментарий, вы можете изменить метод инициализации ядра маршрутизаторов после создания основного маршрутизатора, чтобы добавить поведение шаблонов (перезагрузить ваше представление?): Вот пример, который может вам подойдет.

ответил(а) 2021-01-25T16:50:53+03:00 4 месяца, 4 недели назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема