Полимер-приложение Маршрут с подкачкой
Читаем: https://www.polymer-project.org/2.0/toolbox/case-study и: https://github.com/PolymerElements/app-route
Я думаю, что просто запутался, как использовать компонент подпрограммы, но прочитанные документы и примеры на самом деле никуда меня не привели.
Если бы кто-нибудь мог указать мне на слона в комнате, это было бы здорово.
Что я пытаюсь достичь? У меня есть список элементов (называемых делами), которые я отображаю в my-Affairs.html (эта страница в настоящее время вызывает другой пользовательский элемент под названием Affairs-list.html, который просматривает список) http://127.0.0.1:8081/matters
Я хочу иметь возможность щелкнуть одну из них и перейти на страницу с подробностями (я создал этот шаблон, который называется Affairs-details.html EG: http://127.0.0.1:8081/matters/123
Вопрос:
Как мне справиться с маршрутизацией на my-Affairs.html, насколько я понимаю, что если я добавлю кнопку для нажатия href / Affairs / 123, на странице my-material.html должна быть логика маршрута приложения, которая знает, как закрыть вопрос-лист и раскрыть вопрос подробно?
Или я иду по этому поводу неправильно, и мне нужно добавить две страницы my-Affairs-list.html my-Affairs-details.html и использовать маршрутизацию my-app там под URL-адресом / делами?
Вот мой код, взятый в основном из стартового набора: my-app.html
<link rel="import" href="../bower_components/polymer/polymer-element.html">
<link rel="import" href="../bower_components/app-layout/app-drawer/app-drawer.html">
<link rel="import" href="../bower_components/app-layout/app-drawer-layout/app-drawer-layout.html">
<link rel="import" href="../bower_components/app-layout/app-header/app-header.html">
<link rel="import" href="../bower_components/app-layout/app-header-layout/app-header-layout.html">
<link rel="import" href="../bower_components/app-layout/app-scroll-effects/app-scroll-effects.html">
<link rel="import" href="../bower_components/app-layout/app-toolbar/app-toolbar.html">
<link rel="import" href="../bower_components/app-route/app-location.html">
<link rel="import" href="../bower_components/app-route/app-route.html">
<link rel="import" href="../bower_components/iron-pages/iron-pages.html">
<link rel="import" href="../bower_components/iron-selector/iron-selector.html">
<link rel="import" href="../bower_components/paper-icon-button/paper-icon-button.html">
<link rel="import" href="my-icons.html">
<link rel="lazy-import" href="my-home.html">
<link rel="lazy-import" href="my-matters.html">
<link rel="lazy-import" href="my-view2.html">
<link rel="lazy-import" href="my-view3.html">
<link rel="lazy-import" href="my-view404.html">
<dom-module id="my-app">
<template>
<style>
:host {
--app-primary-color: #4285f4;
--app-secondary-color: black;
display: block;
}
app-drawer-layout:not([narrow]) [drawer-toggle] {
display: none;
}
app-header {
color: #fff;
background-color: var(--app-primary-color);
}
app-header paper-icon-button {
--paper-icon-button-ink-color: white;
}
.drawer-list {
margin: 0 20px;
}
.drawer-list a {
display: block;
padding: 0 16px;
text-decoration: none;
color: var(--app-secondary-color);
line-height: 40px;
}
.drawer-list a.iron-selected {
color: black;
font-weight: bold;
}
</style>
<app-location
route="{{route}}"
url-space-regex="^[[rootPath]]">
</app-location>
<app-route
route="{{route}}"
pattern="[[rootPath]]:page"
data="{{routeData}}"
tail="{{subroute}}">
</app-route>
<app-route
route="{{subroute}}"
pattern="/:id"
data="{{subrouteData}}">
</app-route>
<app-drawer-layout fullbleed force-narrow narrow="{{narrow}}">
<!-- Drawer content -->
<app-drawer id="drawer" slot="drawer" swipe-open="[[narrow]]">
<app-toolbar>Menu</app-toolbar>
<iron-selector selected="[[page]]" attr-for-selected="name" class="drawer-list" role="navigation">
<a name="home" href="[[rootPath]]home">Welcome</a>
<a name="matters" href="[[rootPath]]matters">Matters</a>
<a name="view2" href="[[rootPath]]view2">View Two</a>
<a name="view3" href="[[rootPath]]view3">View Three</a>
</iron-selector>
</app-drawer>
<!-- Main content -->
<app-header-layout has-scrolling-region>
<app-header slot="header" condenses reveals effects="waterfall">
<app-toolbar>
<paper-icon-button icon="my-icons:menu" drawer-toggle></paper-icon-button>
<div main-title>LegalSuite Software</div>
</app-toolbar>
</app-header>
<iron-pages
selected="[[page]]"
attr-for-selected="name"
fallback-selection="view404"
role="main">
<my-home name="home"></my-home>
<my-matters name="matters"></my-matters>
<my-view2 name="view2"></my-view2>
<my-view3 name="view3"></my-view3>
<my-view404 name="view404"></my-view404>
</iron-pages>
</app-header-layout>
</app-drawer-layout>
</template>
<script>
// Gesture events like tap and track generated from touch will not be
// preventable, allowing for better scrolling performance.
Polymer.setPassiveTouchGestures(true);
class MyApp extends Polymer.Element {
static get is() { return 'my-app'; }
static get properties() {
return {
page: {
type: String,
reflectToAttribute: true,
observer: '_pageChanged',
},
routeData: Object,
subroute: Object,
// This shouldn't be neccessary, but the Analyzer isn't picking up
// Polymer.Element#rootPath
rootPath: String,
};
}
static get observers() {
return [
'_routePageChanged(routeData.page)',
];
}
_routePageChanged(page) {
// If no page was found in the route data, page will be an empty string.
// Default to 'home/Welcome' in that case.
this.page = page || 'home';
// Close a non-persistent drawer when the page & route are changed.
if (!this.$.drawer.persistent) {
this.$.drawer.close();
}
}
_pageChanged(page) {
// Load page import on demand. Show 404 page if fails
const resolvedPageUrl = this.resolveUrl('my-' + page + '.html');
Polymer.importHref(
resolvedPageUrl,
null,
this._showPage404.bind(this),
true);
}
_showPage404() {
this.page = 'view404';
}
}
window.customElements.define(MyApp.is, MyApp);
</script>
</dom-module>
my-Affairs.html: `
<link rel="import" href="../bower_components/polymer/polymer-element.html">
<link rel="import" href="shared-styles.html">
<link rel="import" href="Matters/matter-list.html">
<link rel="import" href="Matters/matter-detail.html">
<dom-module id="my-matters">
<div>
<template>
<style include="shared-styles">
:host {
display: block;
padding: 10px;
}
</style>
<div class="card">
<div class="circle">M</div>
<h1>Matters</h1>
<matter-list></matter-list>
//example
<matter-detail linkedmatterid="123"></matter-detail>
</template>
</div>
<script>
class Matters extends Polymer.Element {
static get is() { return 'my-matters'; }
}
window.customElements.define(Matters.is, Matters);
</script>
</dom-module>
1 ответ
Если вы должны иметь URL-адрес, как / вопросов / 123
1) Удалите второй элемент app-route из my-app.html и добавьте его в my-Affairs.html.
<app-route
route="{{subroute}}"
pattern="/:id"
data="{{subrouteData}}">
</app-route>
2) Измените железные страницы в элементе my-app.html, чтобы включить маршрут:
<my-matters name="matters" route="[[subroute]]"></my-matters>
3) Добавьте идентификатор как свойство my-Affairs.html.
static get properties() { return {
id: {
type: Number,
value: ''
},
route: {
type: Object
},
subrouteData: {
type: Object
}
}
4) Обновите шаблон в my-Affairs.html, чтобы показать детали и скрыть список, т.е.
<template is="dom-if" if="[[!_idIsDefined(subrouteData.id)]]">
<matter-list></matter-list>
</template>
<template is="dom-if" if="[[_idIsDefined(subrouteData.id)]]">
<matter-detail linkedmatterid="[[subrouteData.id]]"></matter-detail>
</template>
5) Создайте логику для работы с шаблоном:
_idIsDefined(id){
//There are probably ways to optimize this
if(id){
return true;
}
return false;
}
РЕДАКТИРОВАТЬ: Я бы посоветовал использовать приложение Polymer Shop для изучения Polymer, его код настолько богат маршрутизацией, наблюдателями, привязкой данных и служит отличной отправной точкой.
EDIT2: обновлены шаги 3 и 4 для использования идентификатора из subrouteData.