Как мне прослушать и отреагировать на пустой маршрут, используя {can.route}?

Я хочу настроить маршрутизацию с CanJS так, чтобы в зависимости от того, какой URL я нажал, был настроен соответствующий элемент управления. Моя проблема заключается в попытке найти способ выражения маршрута по умолчанию для прослушивания в элементе управления: "Если ничего не найдено, то сделайте это". Любые советы по этому вопросу?

Это мой код до сих пор. Кажется, работает для URL, как /#!/plant/1/day/3 а также /#!/plant/1, но не для /#! или же /

can.route('plant/:plant_id/day/:day', {});
can.route('plant/:plant_id', {});
can.route('', {});

var Router = can.Control({}, {
  init : function () {},

  "{can.route}" : function (route, event, newVal, oldVal) {
    console.log('Init default control');
  },

  "{can.route} plant_id" : function (route, event, newVal, oldVal) {
    console.log('Init plant control');
  },

  "{can.route} day" : function (route, event, newVal, oldVal) {
    console.log('Init day control');
  }
});

PS Мне действительно удалось сделать это с помощью плагина Can.Control.route, выполнив это:

"route" : function (route, event, newVal, oldVal) {
    console.log('route Default route', arguments);
}

Но плагин route, похоже, настраивает маршруты и реагирует на них, и я хотел знать, как это сделать без специального плагина.

3 ответа

Ваше решение работает, но вы также можете использовать плагины can.Control.route, которые позволяют вам определять и прослушивать маршруты непосредственно в действии контроллера:

var Router = can.Control({
    init : function(el, options) {
    },

    "/:plantId route" : function(data) {
        // the route says /id
        // data.id is the id or default value
    },

    route : function(data){
        // the route is empty
    }
});
new Router(window);

Закончилось делать что-то вроде следующего, но это кажется не идеальным...

    "{can.route} change" : function (ev, attr, how, newVal, oldVal) {
        if(newVal=== 'add' && (!ev.attr('plant_id') && !ev.attr('day')))
        console.log('{can.route} Default route', arguments);
    },

Я заметил ту же проблему с маршрутом по умолчанию '/'. Я погрузился в pushstate.js и обнаружил, что он не работает должным образом с маршрутом по умолчанию. Вы можете увидеть более подробную информацию здесь: https://forum.javascriptmvc.com/

Я ничего не тестировал без pushstate.js (используя #!), Так что это относится только к использованию pushstate.

Другие вопросы по тегам