第一个Polymer应用 - (4)收尾工作
原文链接: Step 4: Finishing touches
翻译日期: 2014年7月8日
翻译人员: 铁锚
在本节中,会在卡片上添加收藏按钮,并可以通过切换选项卡(tabs)连接到不同的 <post-list> 控制器, 整个应用就算完成了.
在本节中,您将学习:
- 声明事件处理(event handling)
- 向元素的原型(prototype)添加属性和方法(properties and methods)
- 自动节点查找(Automatic node finding)
编辑 post-card.html 文件
进入根目录下的starter目录, 打开 post-card.html 文件. 添加 <core-icon> 元素:
<div class="card-header" layout horizontal center>
<content select="img"></content>
<content select="h2"></content>
</div>
<core-icon-button
id="favicon"
icon="favorite"
on-tap="{{favoriteTapped}}">
</core-icon-button>
<content></content>
说明:
- 顾名思义, <core-icon-button> 创建一个嵌入图标的button. Polymer 包含了一写可伸缩的图标集合。
- icon="favorite" 属性从默认图标集中选择心形图标.
- on-tap="{{favoriteTapped}}" 属性在 post-card 元素上指定一个回调方法,当触摸(tap)按钮时就会调用。
---------------------------------------------------------------------------------------------
将 favorite 属性(property) 以及 favoriteTapped 方法添加到元素的原型(prototype).
<script>
Polymer({
publish: {
favorite: {
value: false,
reflect: true
}
},
favoriteTapped: function(event, detail, sender) {
this.favorite = !this.favorite;
this.fire('favorite-tap');
}
});
</script>
说明:
- publish 对象是另一种指定发布属性的方式,和步骤3中所示的 attributes 属性一样的功能。此处 favorite 属性的默认值为 false , 通过设置反射(reflects), 意味着在属性值发生变化时 favorite 属性会被更新
- favoriteTapped事件切换 favorite 属性(this.favorite)的状态,并使用内置的 fire 方法触发自定义事件,。( fire 是 Polymer 添加到每个自定义元素原型的工具方法之一)
这些变化的结果是,当触摸 favorite 按钮时,favorite 属性值被更新, 并且根据其相应的属性被设置或还原。
但现在还没有标识按钮被按下的视觉效果。
---------------------------------------------------------------------------------------------------
为 favorite 按钮添加以下CSS样式:
core-icon-button {
position: absolute;
top: 3px;
right: 3px;
fill: #636363;
}
:host([favorite]) core-icon-button {
fill: #da4336;
}
说明:
- fill 属性设置图标的填充颜色。
- :host([favorite]) core-icon-button 选择器设置当自定义元素设置了 favorite 属性时的填充颜色.
-------------------------------------------------------------------------------
保存 post-card.html.
保存之后,你可以刷新页面,看看 favorite 按钮的效果, 当然还有一些步骤需要完成。
编辑 index.html 文件
打开index.html ,更新tab的事件处理器,当用户切换选项卡时切换 <post-list> 的状态:
<script>
// 获取选项卡DOM元素 paper-tabs
var tabs = document.querySelector('paper-tabs');
var list = document.querySelector('post-list');
// 添加事件监听, 很明显,你需要chrome浏览器来运行
// 这里每次切换会触发2次,前一个tab取消选中,以及新tab被选中
tabs.addEventListener('core-select', function(e) {
//
list.show = tabs.selected;
//
var detail = e["detail"] || {};
var item = detail["item"] || {};
var isSelected = detail["isSelected"];
console.log(
"Tab(\""+ item["innerText"] + "\") changeTo: "+ isSelected +";"
+" [" + tabs.selected + "] isSelected "
);
});
</script>
保存 index.html 文件.
-------------------------------------------------------------------------------------
编辑 post-list.html
在编辑器中打开 post-list.html 文件.
更新 template ,将 <post-card> 元素连接上favorites:
<template repeat="{{post in posts}}">
<post-card
favorite="{{post.favorite}}"
on-favorite-tap="{{handleFavorite}}"
hidden?="{{show == 'favorites' && !post.favorite}}">
<img src="{{post.avatar}}" width="70" height="70">
<h2>{{post.username}}</h2>
<p>{{post.text}}</p>
</post-card>
</template>
说明:
- favorite="{{post.favorite}}" 将卡片元素的 favorite 值绑定到 <post-service> 持有数组中的值
- on-favorite-tap属性为 <post-card> 的 favorite-tap 事件设置一个事件处理程序
- hidden?="{{}}" 表达式是boolean属性的特殊语法,如果绑定的表达式计算值为true则设置该属性
hidden 的绑定表达式实际的作用是在 <所有> 与 <收藏> 选项卡之间切换。
-----------------------------------------------------------
为 favorite-tap 事件添加事件处理程序:
<script>
Polymer({
handleFavorite: function(event, detail, sender) {
var post = sender.templateInstance.model.post;
this.$.service.setFavorite(post.uid, post.favorite);
}
});
</script>
说明:
- sender.templateInstance.model 是模型数据的一个引用,用来构建模板实例。在这里,它包含用来创建一个 <post-card> 的 post对象, 所以你可以获取它的ID以及 favorite 值。
- 自定义元素的 shadow DOM 中的每个元素都有一个 id 属性被加到了 this.$ 字典(dictionary)中。这被称为自动节点发现(automatic node finding.)
如果这是一个真实的社交网络服务, setFavorite 方法会将数据的改变保存到服务器。在这个示例中,除了打印一下日志控制台消息外并没有处理这些工作。
大功告成
保存(建议编辑过程中随时保存,这是好的编码习惯) post-list.html 文件,部署,然后用chrome打开链接或刷新页面, 比如:
http://localhost:8080/polymer-tutorial-master/starter/index.html
大功告成! 如果幸运的话,您的应用程序看起来像这样:
如果发生错误或不显示,可以和 finished 目录下的 post-card.html, post-list.html, index.html 文件对比,当然,你也可以直接访问这下面的文件试试效果。
开始下一个项目
准备好开始一个你自己的项目了吗?安装一些 Polymer 组件并开始工作吧!
--> 下一个项目: 安装组件(Installing components)
第一个Polymer应用 - (4)收尾工作的更多相关文章
- 第一个Polymer应用 - (3)使用数据绑定
原文链接: Step 3: Using data binding翻译日期: 2014年7月7日翻译人员: 铁锚我们创建的个人信息卡还算漂亮,但对整个应用来说,只有一张卡片看起来有点空荡荡的感觉.在本节 ...
- 第一个Polymer应用 - (2)创建你自己的元素
原文链接: Step 2: Your own element翻译日期: 2014年7月6日翻译人员: 铁锚通过上一节的学习和实践, 您已经完成了一个基本的应用程序结构(application stru ...
- 第一个Polymer应用 - (1)创建APP结构
原文链接: Step 1: Creating the app structure翻译日期: 2014年7月5日翻译人员: 铁锚在本节中,将使用一些预先构建好的Polymer元素来创建基本的应用程序结构 ...
- 第一个Polymer应用 - (0)准备工作
原文链接: Getting Started - Your first Polymer application翻译时间: 2014年7月5日翻译人员: 铁锚 关于Polymer 的简介,请参考 CSD ...
- 一个农民工自学java找到工作的励志故事
<!-----------------------------------------------------------------------------摘自网络-------------- ...
- Python全栈开发记录_第八篇(模块收尾工作 json & pickle & shelve & xml)
由于上一篇篇幅较大,留下的这一点内容就想在这里说一下,顺便有个小练习给大家一起玩玩,首先来学习json 和 pickle. 之前我们学习过用eval内置方法可以将一个字符串转成python对象,不过, ...
- 浅析一个lua文件窥slua工作机制
slua的东西不是几句话能讲得完,这里只说结论不说原因,原因有空写个Little Slua工程来解释,下面注释中有几个关键点:LuaVar系列类:LuaFunction,LuaTable,LuaDel ...
- 【转】十年你能做的能得到的有多少?一个工科IT男的工作回忆
https://blog.csdn.net/b5w2p0/article/details/8798989
- 创建Account控制器 安全性与收尾工作 精通ASP-NET-MVC-5-弗瑞曼
随机推荐
- SpriteKit塔防游戏动态改变防御塔价格标签的颜色
大熊猫猪·侯佩原创或翻译作品.欢迎转载,转载请注明出处. 如果觉得写的不好请多提意见,如果觉得不错请多多支持点赞.谢谢! hopy ;) 本篇blog在DinoDefense塔防游戏基础之上做一处小的 ...
- lucene索引库的增删改查操作
1. 索引库的操作 保持数据库与索引库的同步 说明:在一个系统中,如果索引功能存在,那么数据库和索引库应该是同时存在的.这个时候需要保证索引库的数据和数据库中的数据保持一致性.可以在对数据库进行增.删 ...
- Android 9Patch图片的使用-android学习之旅(十八)
9patch的使用方法 9patch图片常被用来做消息发送等的图片,只是缩放照片的部分区域,使得图片的整体形状不会受到影响,比较方便. 下面我们介绍一下: 在android的SDK安装目录下的tool ...
- 最简单的基于DirectShow的示例:获取Filter信息
===================================================== 最简单的基于DirectShow的示例文章列表: 最简单的基于DirectShow的示例:视 ...
- UNIX网络编程——客户/服务器程序设计示范(二)
TCP并发服务器程序,每个客户一个子进程 传统上并发服务器调用fork派生一个子进程来处理每个客户.这使得服务器能够同时为多个客户服务,每个进程一个客户.客户数目的唯一限制是操作系统对以其名义 ...
- erMaster插件
需求: 在做开源项目时,了解基本业务后.试图从数据库表设计来分析项目.通过visio时绘制操作繁琐,另外不能与数据库连动.于是想找一款快速绘制er图,并且能够和数据库连动的软件工具. eclipse插 ...
- 最简单的基于FFmpeg的封装格式处理:视音频分离器简化版(demuxer-simple)
===================================================== 最简单的基于FFmpeg的封装格式处理系列文章列表: 最简单的基于FFmpeg的封装格式处理 ...
- Linux下jetty报java.lang.OutOfMemoryError: PermGen space及Jetty内存配置调优解决方案
Linux下的jetty报java.lang.OutOfMemoryError: PermGen space及Jetty内存配置调优解决方案问题linux的jetty下发布程序后再启动jetty服务时 ...
- [GitHub]第四讲:合并分支
本地两个分支合并 先从最简单的一种情况着手.现在项目只有一个 master 分支,我来新建一个 idea 分支,实现自己的想法,commit 一下.那现在仓库内的情况就是这样的 这个是前面已经见过的情 ...
- 详解EBS接口开发之WIP模块接口
总体说明 文档目的 本文档针对WIP模块业务功能和接口进行分析和研究,对采用并发请求方式和调用API方式分别进行介绍 内容 WIP模块常用标准表简介 WIP事物处理组成 WIP相关业务流程 WIP相关 ...