Backbone.js, как мне определить пользовательский набор маршрутов в зависимости от определенного состояния приложения - PullRequest
3 голосов
/ 02 марта 2012

В настоящее время создается приложение, работающее на мобильных телефонах, которое не связано с рассматриваемой проблемой, но через определенное событие приложение попадает в состояние, либо онлайн, либо в автономном режиме (интернет доступен по телефону или нет)

автономное приложение очень ограничено, доступно только несколько экранов)

теперь остановите меня, если вы поймаете меня на том, что я делаю что-то глупое или что-то, что я мог бы сделать намного лучше, но моей первой мыслью было иметь маршрутизатординамический набор маршрутов,

так же, как вы можете определить свойство динамического URL для коллекции.

, поэтому вместо этого:

var router = Backbone.Router.extend({
    routes: {
        '' : 'homeAction',
        'categories' : 'categoriesAction',
        ...
    },
    homeAction: function(){ },
    categoriesAction: function(){ }
});

я думал об этом:

var router = Backbone.Router.extend({
    initialize: function(){
        this.on('app:togglestate', this.toggleRoutes, this);
    },
    toggleRoutes: function () {
        var router = this;
        if(App.onlineModus)
            router.routes = { /* hash with online routes here */ };
        else
            router.routes = { /* hash with offline routes here */ };
    },
    routes: {
        '' : 'homeAction',
        'categories' : 'categoriesAction',
        ...
    },
    homeAction: function(){ },
    categoriesAction: function(){ }
});

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

Возможно, я задумываюсь далеко?Должен ли я достичь этого каким-то другим способом?

у меня была еще одна идея:

  • с маршрутами, точно такими же, как url, где аргумент route - это функция, возвращающая хеш, который не сделал 'не работает или
  • , и теперь я думаю, что все по-другому, что-то вроде тестирования, если приложение находится в режиме онлайн или в автономном режиме в действии каждого маршрута.хотя это кажется слишком много, я, вероятно, должен был бы передать их все через одно Действие, которое переходит к действительному действию, если маршрут доступен в автономном режиме?но у меня не было бы ясного представления о том, как начать с таким действием реле, не написав слишком много шаблонного кода ...

Ответы [ 2 ]

1 голос
/ 27 июня 2012

Для динамического обновления маршрутов вам нужно будет вызвать _bindRoutes () после обновления маршрутов.

Например:

toggleRoutes: function () {
    var router = this;
    if(App.onlineModus)
        router.routes = { /* hash with online routes here */ };
    else
        router.routes = { /* hash with offline routes here */ };

    // Get rid of previous navigation history
    if(Backbone.history){
        Backbone.history == null;
    }

    // Bind the new routes
    router._bindRoutes();
}

Обратите внимание, что при динамическом изменениимаршруты истории больше не действительны, поэтому вам нужно удалить предыдущую историю.Когда вызывается _bindRoutes, он автоматически создает новую историю Backbone.history, когда вызывается this.route.

0 голосов
/ 02 марта 2012

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

ApplicationRouter = Backbone.Router.extend({
    //some stuff
    constructor: function (routes) {
        this.routes = routes;
        Backbone.Router.prototype.constructor.call(this);
    }
});

routeObject = {
    "help": "help"
}

ApplicationRouter.instance = function(routes) {
    if (!this._instance) {
        this._instance = new ApplicationRouter(routes);
    }
    return this._instance;
}
ApplicationRouter.instance(routeObject);
ApplicationRouter.instance().on('route:help', function() {
    console.log('helped');
});
Backbone.history.start();
//now go to page#help - the console will say "helped"

С тех пор я только что ссылался на ApplicationRouter.instance (), когда мне требовался доступ к маршрутизатору приложения.

...