2012-02-25 3 views
6

У меня есть следующий маршрутизатор:Backbone маршрутизатор не вызывая маршрут

appRouter = Backbone.Router.extend({ 
    routes: { 
    '': 'inbox', 
    'inbox': 'inbox', 
    'discussions_engagement': 'contacts', 
    }, 

    inbox: function(page) { 
    console.log('inbox'); 
    var page = page || 1; 
    engage.app.hydrateInbox(page, engage.app.showInbox); 
    }, 
    .... 
}; 

Когда я на HTTP: // [...]/# почтовый ящик, и я призываю

appRouter.navigate('inbox', {trigger: true}); 

папка Входящие действия не срабатывает, чего я хочу достичь. Теперь я посмотрел на источник Backbone (https://github.com/documentcloud/backbone/blob/master/backbone.js#L1027), и я вижу, что он не поддерживает то, что я пытаюсь сделать, но есть ли способ сделать это?

+1

Не ответ на ваш вопрос, но, может быть, решение (если я правильно вас понял): (Повторно) Отметьте свою страницу/ваш основной родительский вид, например. 'AppView.render()'. – SunnyRed

ответ

4

Я хотел бы создать менеджер событий в вашем объекте engage.app, как это:

var vent = _.extend({}, Backbone.Events); 

Затем в маршрутизаторе сделать это для почтового ящика маршрута:

vent.trigger('inbox:show', page); 

И справиться с этим событием в объект join.app, выполняющий там код, который использовался в обработчике маршрута.

Теперь вместо вызова appRouter.navigate вы можете вызвать это событие.

Кроме того, из этого обработчика вы можете позвонить appRouter.navigate('inbox');, не передавая правдивость. Теперь вы можете получить свое приложение в нужное вам состояние, не пытаясь заставить маршрут.

+0

Вот что я закончил делать; похоже на полуподобное решение, хотя оно и создает дополнительный код. –

+0

@JasonStonebraker [Эта ссылка] (http://lostechies.com/derickbailey/2011/08/28/dont-execute-a-backbone-js-route-handler-from-your-code/) объясняет эту идею. Этот образец работал хорошо для меня. Он оставляет маршрутизатор с одним заданием, которое маршрутизируется на основе изменений URL-адреса браузера. Этот вопрос касался попытки запуска маршрута, когда вы уже на этом пути. Это решение не обходное решение (IMO), а лучший дизайн. –

-1

Другим вариантом является просто вызвать метод

appRouter.inbox(); 
2

Насколько я могу сказать ... По магистральным 0.9.10 с использованием appRouter.navigate('inbox', {trigger: true}); работ, как ожидалось.

+0

Источник Backbone все еще имеет это: 'if (this.fragment === фрагмент) return;', поэтому я думаю, что проблема Gavin все еще существует. Кроме того, у источника есть комментарий: «Объект options может содержать« trigger: true », если вы хотите запустить обратный вызов маршрута (обычно не желательно)». –

Смежные вопросы