Polymer 带子分页的聚合-应用路由
我读到: 以及: 我想我只是对如何使用子程序组件感到困惑,但我所阅读的文档和示例并没有真正让我有所收获 如果有人能为我指出房间里的大象,那就太好了 我想要实现什么? 我有一个显示在my-matters.html上的项目列表(称为matters)(此页面当前调用另一个名为matters-list.html的自定义元素,该元素通过列表显示) 我希望能够单击其中一个并转到详细信息页面(我已经构建了名为matters-details.html的模板) 例如: 问题是: 如何处理my-matters.html上的路由 我的理解是,如果我添加一个按钮点击href/matters/123,my-matter.html页面上应该有一些应用程序路由逻辑,知道如何关闭事件列表并打开事件详细信息 还是我做得不对,需要添加两页 my-matters-list.html my-matters-details.html 在我的应用程序路由中,在url/matters下使用这两个选项 以下是我从初学者工具包中获取的代码:my-app.htmlPolymer 带子分页的聚合-应用路由,polymer,polymer-2.x,app-route,Polymer,Polymer 2.x,App Route,我读到: 以及: 我想我只是对如何使用子程序组件感到困惑,但我所阅读的文档和示例并没有真正让我有所收获 如果有人能为我指出房间里的大象,那就太好了 我想要实现什么? 我有一个显示在my-matters.html上的项目列表(称为matters)(此页面当前调用另一个名为matters-list.html的自定义元素,该元素通过列表显示) 我希望能够单击其中一个并转到详细信息页面(我已经构建了名为matters-details.html的模板) 例如: 问题是: 如何处理my-matters.h
<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>
:主持人{
--app原色:#4285f4;
--app二次颜色:黑色;
显示:块;
}
应用程序抽屉布局:非([窄])[抽屉切换]{
显示:无;
}
应用程序标题{
颜色:#fff;
背景色:var(--app原色);
}
应用程序标题纸图标按钮{
--纸张图标按钮墨水颜色:白色;
}
1.出票人名单{
利润率:0.20px;
}
.出票人名单a{
显示:块;
填充:0 16px;
文字装饰:无;
颜色:var(--app二次色);
线高:40px;
}
.抽屉列表a.已选定{
颜色:黑色;
字体大小:粗体;
}
LegalSuite软件
//由触摸生成的手势事件(如轻触和轨迹)将不会显示
//可预防,允许更好的滚动性能。
聚合物。设置被动接触(真);
类MyApp扩展了Polymer.Element{
静态get是(){return'my app';}
静态获取属性(){
返回{
第页:{
类型:字符串,
reflectToAttribute:true,
观察者:''u pageChanged',
},
routeData:对象,
子例程:对象,
//这应该不是必要的,但分析仪没有检测到
//聚合物.元素#根路径
根路径:字符串,
};
}
静态获取观察器(){
返回[
“_routePageChanged(routeData.page)”,
];
}
_routePageChanged(第页){
//如果在路由数据中找不到页面,则页面将是空字符串。
//在这种情况下,默认为“主页/欢迎”。
this.page=第| |页“主页”;
//更改页面和路径时关闭非持久性抽屉。
如果(!this.$.drawer.persistent){
此.drawer.close();
}
}
_页面更改(第页){
//按需加载页面导入。如果失败,则显示404页面
const resolvedPageUrl=this.resolveUrl('my-'+page+'.html');
聚合物进口参考号(
resolvedPageUrl,
无效的
这个。_showPage404.bind(这个),
正确的);
}
_showPage404(){
this.page='view404';
}
}
window.customElements.define(MyApp.is,MyApp);
my-matters.html:
`
:主持人{
显示:块;
填充:10px;
}
M
事项
//范例
类。元素{
静态get是(){return'my matters';}
}
window.customElements.define(Matters.is,Matters);
如果您必须拥有类似/matters/123的URL
1) 从my-app.html中删除第二个app-route元素并将其添加到my-matters.html
<app-route
route="{{subroute}}"
pattern="/:id"
data="{{subrouteData}}">
</app-route>
static get properties() { return {
id: {
type: Number,
value: ''
},
route: {
type: Object
},
subrouteData: {
type: Object
}
}
4) 更新my-matters.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>
编辑:
我建议使用来学习聚合物,它的代码在路由、观察者、数据绑定方面非常丰富,是一个很好的起点
编辑2:
更新了步骤3和步骤4,以使用子程序数据中的id。如果您必须具有类似/matters/123的URL 1) 从my-app.html中删除第二个app-route元素并将其添加到my-matters.html
<app-route
route="{{subroute}}"
pattern="/:id"
data="{{subrouteData}}">
</app-route>
static get properties() { return {
id: {
type: Number,
value: ''
},
route: {
type: Object
},
subrouteData: {
type: Object
}
}
4) 更新my-matters.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>
编辑:
我建议使用来学习聚合物,它的代码在路由、观察者、数据绑定方面非常丰富,是一个很好的起点
编辑2:
更新了步骤3和步骤4,以使用子程序数据中的id。谢谢!这已经为我澄清了很多事情,实现上面的代码并没有完全起作用,因为_idisdefine没有被击中,但是通过商店演示,我应该能够弄明白,我会在这里发布。你好,罗斯,我更新了我的答案:步骤3和4现在使用(正在观察)直接来自子计算数据的id,现在应该可以用了。这应该会在每次id更改路由中的值时触发_idIsDefined。不幸的是,仍然没有找到它,谢谢你!这已经为我澄清了很多事情,实现上面的代码并没有完全起作用,因为_idisdefine没有被击中,但是通过商店演示,我应该能够弄明白,我会在这里发布。你好,罗斯,我更新了我的答案:步骤3和4现在使用(正在观察)直接来自子计算数据的id,现在应该可以用了。每次id更改route.com中的值时,都会触发_idIsDefined