Использование route-href с дочерними маршрутизаторами

Я пытаюсь использовать атрибут route-href внутри представления в дочернем маршрутизаторе. Мой родительский роутер выглядит так:

configureRouter(config, router){
    config.title = 'Kali';
    config.map([
        // { route: '', moduleId: 'no-selection', title: 'Select'},
        { route: ['', 'courses'],  moduleId: 'courses' }
    ]);

    this.router = router;
}

Мой дочерний роутер выглядит так:

configureRouter(config, router){
    config.map([
        { route: ['', '/'], moduleId: 'no-selection', title: 'Select'},
        { route: '/:id',  moduleId: 'courses/course-detail' }
    ]);

    this.router = router;
}

А вот мой атрибут route-href...

<a route-href="route: '', params: { id: course.id }" click.delegate="$parent.select(course.id)">

Когда я использую это, я ожидаю, что route-href будет использовать маршруты от дочернего маршрутизатора. Вместо этого я получаю эту трассировку стека. Просматривая код, я вижу, что RouteHref вызывает router.generate для создания маршрута. router.generate должен рекурсивно подниматься по иерархии маршрутизаторов, так что это не должно быть проблемой. Однако я не уверен, какой маршрутизатор передается конструктору route-href. Я думаю, что здесь есть две проблемы: во-первых, я не уверен, что route-href получает правильный маршрутизатор, а во-вторых, я не уверен, обрабатывает ли route-href выражение с пустым маршрутом и каким образом.

Трассировки стека:

message: "There is no route named '', params: { id: course.id }"
stack: "Error: There is no route named '', params: { id: course.id }↵    at RouteRecognizer.generate (http://localhost:9000/jspm_packages/github/aurelia/[email protected]/index.js:244:19)↵    at AppRouter.generate (http://localhost:9000/jspm_packages/github/aurelia/[email protected]/router.js:210:38)↵    at Router.generate (http://localhost:9000/jspm_packages/github/aurelia/[email protected]/router.js:207:32)↵    at RouteHref.processChange (http://localhost:9000/jspm_packages/github/aurelia/[email protected]/route-href.js:42:34)↵    at RouteHref.bind (http://localhost:9000/jspm_packages/github/aurelia/[email protected]/route-href.js:30:16)↵    at BehaviorInstance.bind (http://localhost:9000/jspm_packages/github/aurelia/[email protected]/behavior-instance.js:68:35)↵    at View.bind (http://localhost:9000/jspm_packages/github/aurelia/[email protected]/view.js:68:26)↵    at ViewFactory.create (http://localhost:9000/jspm_packages/github/aurelia/[email protected]/view-factory.js:173:18)↵    at BoundViewFactory.create (http://localhost:9000/jspm_packages/github/aurelia/[email protected]/view-factory.js:127:35)↵    at Repeat.processArrayItems (http://localhost:9000/jspm_packages/github/aurelia/[email protected]/repeat.js:132:32)"

Любые идеи? Спасибо.


person jedd.ahyoung    schedule 10.05.2015    source источник
comment
Вы пытались использовать полный маршрут вместо одного идентификатора?   -  person sam    schedule 10.05.2015
comment
Также не похоже, что он обрабатывает ваш курс.id?   -  person sam    schedule 10.05.2015
comment
Да, я пробовал route: courses, params: { id: course.id }, но это тоже не сработало. Это работало до того, как я представил дочерние маршрутизаторы.   -  person jedd.ahyoung    schedule 10.05.2015
comment
Это вообще не работает   -  person Shahid Karimi    schedule 22.11.2017


Ответы (1)


Похоже, что route-href использует свойство name маршрута.

Возможно, ваш дочерний маршрутизатор должен выглядеть так:

configureRouter(config, router){
    config.map([
        { route: ['', '/'], moduleId: 'no-selection', title: 'Select'},
        { route: '/:id',  moduleId: 'courses/course-detail', name: 'course-detail' }
    ]);

    this.router = router;
}

и на ваш взгляд:

<a route-href="route: course-detail; params.bind: { id: course.id }" ...
person Josh Graham    schedule 12.05.2015
comment
route-href передает this.route методу generate маршрутизатора. generate действительно называет имя своего параметра, но это не имеет к этому никакого отношения. Я попробовал это, и это не сработало. Хотя хотелось бы, чтобы это было. К сожалению, мне, вероятно, просто придется собрать тестовый пример для этого. - person jedd.ahyoung; 12.05.2015
comment
Я беру это обратно, на самом деле. Я просматриваю это больше, и похоже, что вы можете быть правы - это все еще не работает, но похоже, что модуль распознавания маршрутов смотрит на route.handler.name, а конфигурация маршрута передается как обработчик. Я действительно не уверен, как это работает, хотя. - person jedd.ahyoung; 12.05.2015
comment
Упс! Я только что получил это работает на моей машине. Мы использовали , в route-href, когда мы должны были использовать ; facepalm. Я отредактировал ответ, теперь он должен работать. - person Josh Graham; 13.05.2015
comment
Ух ты. Это сработало. Полагаю, я не ожидал полного JS-выражения внутри обработчика route-href - я не ожидал ни точки с запятой, ни оператора params.bind. Есть ли документация для этого? Я готов предоставить документацию по использованию route-href, так как уверен, что это поможет людям, которые еще не знакомы. Я скажу, что немного странно видеть часть языка привязки внутри такого выражения. Я не ожидал, что это будет проанализировано. - person jedd.ahyoung; 13.05.2015
comment
Кроме того, чем больше я об этом думаю... это работало с исходным маршрутом, без каких-либо дочерних маршрутизаторов. Не лучше ли было бы сохранить поведение как можно более однородным? Обработчик route-href, вероятно, должен получить доступ к базовому JS-файлу для представления, в котором он находится, а затем пройти оттуда родительскую цепочку (при необходимости). Это повысило бы модульность и способствовало бы единому стандарту кода независимо от уровня вложенности. - person jedd.ahyoung; 13.05.2015
comment
Единственное место, где я нашел какую-либо информацию о route-href, это источник приложения для контактов. Я не уверен, что вы имеете в виду под единым стандартом кода независимо от уровня вложенности, синтаксис должен быть одинаковым независимо от уровня вложенности. Разрешение маршрута начнется с текущего уровня и будет выполнять поиск вверх, пока не будет найдено совпадение. Я также отмечу, что Aurelia Gitter действительно хороша, обычно в там они могли описать маршрутизацию лучше, чем я. - person Josh Graham; 13.05.2015
comment
То, что я знаю о route-href, я нашел в приложении для контактов — если вы можете судить по моему коду, я действительно использовал этот проект в качестве базы. Я хорошо знаю Gitter room — я был более активен на ранних стадиях проекта, но в последнее время у меня не было времени. Что касается единого стандарта - route-href не требует свойства name в конфигурации маршрута, когда вы используете его без дочерних маршрутизаторов, как показывает приложение app-contacts. В моем случае я не могу использовать его без указания свойства name. Я не думаю, что код должен измениться, если вы вводите дочерние маршрутизаторы. Имеет ли это смысл? - person jedd.ahyoung; 13.05.2015
comment
Думаю, теперь я понимаю. Свойство name не совсем обязательно, и это может быть источником путаницы. Если на маршруте нет свойства name, он попытается сопоставить свойство title. Вы должны иметь возможность определять дочерние маршруты так же, как и маршруты верхнего уровня. - person Josh Graham; 13.05.2015
comment
Вот именно. я создам тикет о проблеме в репозитории github. - person jedd.ahyoung; 13.05.2015
comment
Я нахожу абсолютно ужасным, что интерфейсная веб-инфраструктура не разъясняет основные методы добавления тега ссылки html. - person Lopsided; 19.03.2018