详解JavaScript的Polymer框架中的通知交互


Posted in Javascript onJuly 29, 2015

Polymer 以访问器属性的形式来定义有监听需求的属性(没有监听需求的属性依然是普通的属性形式定义)。模板中还可以采用「::」语法来将属性双向同步于目标元素的某个事件,这就是 Angular 中双向绑定的概念,甚至还要比它更纯粹、更贴近原理。

在 properties 中定义的属性如果没有添加 notify 并且没在模板中用到,那么它就是没有监听需求的,于是就会被定义成普通属性。否则都会被定义成访问器属性,下面例子就解释了这个问题
运行

<script> var Polymer = { dom: 'shadow' }; </script>
<base href="http://www.web-tinker.com/share/" />
<link rel="import" href="polymer/polymer.html" />

<dom-module id="demo-test">
 <template>
  <h1>[[z]]</h1>
 </template>
 <script>
  Polymer({
   is: 'demo-test',
   properties: {
    x: { value: 'x' },
    y: { value: 'y', notify: true }
   },
   ready: function() {
    console.log(Object.getOwnPropertyDescriptor(this, 'x'));
    console.log(Object.getOwnPropertyDescriptor(this.__proto__, 'y'));
    console.log(Object.getOwnPropertyDescriptor(this.__proto__, 'z'));
   }
  });
 </script>
</dom-module>

<demo-test></demo-test>

设置了 notify 为 true 的属性在其发生变化时会产生一个「属性名-changed」事件。注意属性名和 changed 中间用横杆链接,并且 changed 是过去时态,而不是 change 原形。Polymer 可以使用 listeners 来添加事件监听,但不能直接绑定到函数上,而必须绑定到某个属性名上(我不明白为什么要这么设计)。
运行

<script> var Polymer = { dom: 'shadow' }; </script>
<base href="http://www.web-tinker.com/share/" />
<link rel="import" href="polymer/polymer.html" />

<dom-module id="demo-test">
 <template>
  <h1>[[i]]</h1>
 </template>
 <script>
  Polymer({
   is: 'demo-test',
   properties: {
    i: { value: 0, notify: true }
   },
   ready: function() {
    setInterval(function(that) {
     that.i++; 
    }, 100, this);
   },
   listeners: {
    'i-changed': 'iChangeHandler'
   },
   iChangeHandler: function(event) {
    console.log(event.detail.value);
   }
  });
 </script>
</dom-module>

<demo-test></demo-test>

事件可以在模板中使用「::」语>法来捕获,而且这些事件包括了上面产生的通知事件和用户主动触发的交互事件。
运行

<script> var Polymer = { dom: 'shadow' }; </script>
<base href="http://www.web-tinker.com/share/" />
<link rel="import" href="polymer/polymer.html" /

<dom-module id="demo-test">
 <template>
  <input value="{{text::input}}" /><hr/>
  <textarea value="{{css::input}}"></textarea><hr/>
  <h1 style$="[[css]]">[[text]]</h1>
 </template>
 <script>
  Polymer({ is: 'demo-test' });
 </script>
</dom-module>

<demo-test></demo-test>

详解JavaScript的Polymer框架中的通知交互

 注意上面是 style$="[css]" 而不是直接的 style="css",因为此处是赋值给元素的 attribute 上,而不是纯粹的 property 赋值。所以在等号前面加一个「$」(其实我觉得这个语法看起来非常奇怪)。

以上这些就是我所知道的 Polymer 中所有关于数据绑定的内容了。也许有遗漏,可能会在其它文章中补充。

Javascript 相关文章推荐
双击滚屏-常用推荐
Nov 29 Javascript
javascript解决innerText浏览器兼容问题思路代码
May 17 Javascript
又一款js时钟!transform实现时钟效果
Aug 15 Javascript
详解jQuery的Cookie插件
Nov 23 Javascript
jQuery实现立体式数字动态增加(animate方法)
Dec 21 Javascript
使用原生js写ajax实例(推荐)
May 31 Javascript
详解从新建vue项目到引入组件Element的方法
Aug 29 Javascript
angularjs中$http异步上传Excel文件方法
Feb 23 Javascript
详解如何配置vue-cli3.0的vue.config.js
Aug 23 Javascript
JS实现倒计时图文效果
Nov 17 Javascript
vue-cli设置publicPath小记
Apr 14 Javascript
通过实例了解JS执行上下文运行原理
Jun 17 Javascript
JavaScript的Polymer框架中dom-repeat与VM的相关操作
Jul 29 #Javascript
浅谈JavaScript的Polymer框架中的事件绑定
Jul 29 #Javascript
探讨JavaScript中的Rest参数和参数默认值
Jul 29 #Javascript
JS的框架Polymer中的dom-if和is属性使用说明
Jul 29 #Javascript
js数组去重的方法汇总
Jul 29 #Javascript
浅谈JavaScript的Polymer框架中的behaviors对象
Jul 29 #Javascript
JavaScript中的cacheStorage使用详解
Jul 29 #Javascript
You might like
PHP ? EasyUI DataGrid 资料取的方式介绍
2012/11/07 PHP
PHP三元运算的2种写法代码实例
2014/05/12 PHP
PHP实现的简单三角形、矩形周长面积计算器分享
2014/11/18 PHP
Laravel 5框架学习之日期,Mutator 和 Scope
2015/04/08 PHP
Laravel框架在本地虚拟机快速安装的方法详解
2018/06/11 PHP
JS仿flash上传头像效果实现代码
2011/07/18 Javascript
最佳的addEvent事件绑定是怎样诞生的
2011/10/24 Javascript
jquery滚动组件(vticker.js)实现页面动态数据的滚动效果
2013/07/03 Javascript
js实现页面转发功能示例代码
2013/08/05 Javascript
JavaScript function 的 length 属性使用介绍
2014/09/15 Javascript
jquery代码实现简单的随机图片瀑布流效果
2015/04/20 Javascript
js实现的下拉框二级联动效果
2016/04/30 Javascript
jQuery插件制作的实例教程
2016/05/16 Javascript
浅谈几种常用的JS类定义方法
2016/06/08 Javascript
详解angularJs中关于ng-class的三种使用方式说明
2017/06/02 Javascript
JS和jQuery通过this获取html标签中的属性值(实例代码)
2017/09/11 jQuery
Vue全局使用less样式,组件使用全局样式文件中定义的变量操作
2020/10/21 Javascript
微信小程序对图片进行canvas压缩的方法示例详解
2020/11/12 Javascript
Python实现队列的方法
2015/05/26 Python
Python的Flask框架应用调用Redis队列数据的方法
2016/06/06 Python
python网络编程调用recv函数完整接收数据的三种方法
2017/03/31 Python
Python3中内置类型bytes和str用法及byte和string之间各种编码转换 问题
2018/09/27 Python
python生成n个元素的全组合方法
2018/11/13 Python
python 字符串追加实例
2019/07/20 Python
python每天定时运行某程序代码
2019/08/16 Python
python同步两个文件夹下的内容
2019/08/29 Python
keras训练浅层卷积网络并保存和加载模型实例
2020/07/02 Python
HTML5 新表单类型示例代码
2018/03/20 HTML / CSS
美国知名户外用品畅销中心:Sierra Trading Post
2016/07/19 全球购物
英国高街电视:High Street TV
2018/05/22 全球购物
关于运动会广播稿200字
2014/10/08 职场文书
先进个人申报材料
2014/12/30 职场文书
二十年同学聚会感言
2015/07/30 职场文书
2016大学生毕业实习心得体会
2016/01/23 职场文书
2019年个人工作总结范文
2019/03/25 职场文书
使用Oracle跟踪文件的问题详解
2021/06/28 Oracle