Несколько маршрутизаторов против одного маршрутизатора в BackboneJs - PullRequest
45 голосов
/ 03 декабря 2011

Все примеры Backbone, которые я видел, используют один маршрутизатор для всего приложения, но не имеет ли смысл иметь маршрутизатор для каждой отдельной части вашего приложения (заголовок, нижний колонтитул, сценарий, боковая панель)?Кто-нибудь создавал приложения с более чем одним маршрутизатором и каковы ваши впечатления?

Давайте подумаем о сложном приложении с вложенными представлениями: не было бы лучше, если представление имеет собственный маршрутизатор, который обрабатывает отображениеsubviews, чем иметь один большой маршрутизатор, который должен сообщить основному представлению об изменении своих subviews?

История вопроса: я видел много параллелей маршрутизатора в магистрали и ActivityMapper в GWT.ActivityMapper отвечает только за то, чтобы получить правильного презентатора для данного маршрута и данного контейнера в DOM.

Ответы [ 3 ]

23 голосов
/ 03 декабря 2011

Я написал приложение (все еще пишу) с несколькими маршрутизаторами в нем. однако это не так, как вы думаете, это больше основано на модуле, а не на маршрутизаторе для каждого представления или что-то в этом роде.

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

// user module...
var userRouter = Backbone.Router.extend({
    routes: {
        "users": "loadUsers",
        "users/add": "addUser",
        "user/:id": "loadUser",
        "user/:id/edit": "editUser"
    }

// ... rest dropped to save the trees (you never know if someone prints this out)
});


// book module
var bookRouter = Backbone.Router.extend({
    routes: {
        "books": "loadBooks",
        "books/add": "addBook",
        "book/:name": "loadBook",
        "book/:name/edit": "editBook"
    }

// ... rest dropped to save the trees (you never know if someone prints this out)
});

Итак, два моих маршрутизатора не конкурируют за один и тот же маршрут, каждый из них обрабатывает свой собственный набор маршрутов.

редактировать теперь, когда у меня было больше информации через Эльфа Штернберга, я знаю, что по умолчанию невозможно иметь несколько маршрутизаторов, совпадающих на одном маршруте. без обходного пути, такого как переопределение истории магистрали или использование пространств имен в маршрутах и ​​регулярных выражений для соответствия этим маршрутам. больше информации здесь: несколько подходящих маршрутов спасибо эльфу Штернбергу за ссылку.

22 голосов
/ 10 апреля 2012

Я только что написал сообщение в блоге о модульных подгруппах в Backbone, которые позволяют определить «подправа», которая обращает внимание на все после префикса для этого маршрута.

Проверьте запись в блоге для получения более подробного объяснения: http://www.geekdave.com/?p=13

Это означает, что вам не нужно избыточно определять один и тот же префикс снова и снова, и вы также можете загружать подпрограммы какмодули доступны.Обратная связь приветствуется!

2 голосов
/ 04 мая 2012

Существует ограниченный, но важный случай, когда имеет смысл использовать несколько маршрутизаторов.Если вам нужно предоставить только подмножество маршрутов и представлений вашего приложения на основе данных, собранных во время выполнения (возможно, учетные данные для входа в систему - например, менеджер и персонал могут просматривать и перемещаться между различными наборами представлений), вы можете создать только соответствующий Маршрутизатор и представлениеклассы.Это важно, потому что маршруты могут быть добавлены в закладки и отправлены от пользователя к пользователю.Конечно, вам все еще нужны проверки на сервере, чтобы убедиться, что неавторизованный пользователь не отправляет запросы после перехода к просмотру, к которому они пришли через закладку, отправленную авторизованным пользователем.Но лучше спроектировать приложение, чтобы неавторизованное представление просто не создавалось.

...