JavaScript的Polymer框架中dom-repeat与VM的相关操作


Posted in Javascript onJuly 29, 2015

各种框架都有把一个列表数据绑定到 DOM 上的功能,比如 Angular 会用 ng-repeat 来绑定。那么 Polymer 呢?其实这个级别的功能属于框架的扩展功能了,Angular 的 ng-repeat 也只是个 Directive 而已。Polymer 的 dom-repeat 也是这个级别的东西。

在 Polymer 中,一切都是 Directive 的概念。dom-module 用于定义模块,它本身也是一个 Directive。dom-repeat 也是,但它不是一个标签,而是一个基于 template 标签的 Directive。我们可以这样使用它:
运行

<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>
  <ul>
   <template is="dom-repeat" items="[[data]]">
    <li>
     第 <strong>[[index]]</strong> 项,
     值为 <strong>[[item]]</strong>
    </li>
   </template>
  </ul>
 </template>
 <script>
  Polymer({
   is: 'demo-test',
   properties: {
    data: {
     type: Array,
     value: [ 'a', 'b', 'c', 'd' ]
    }
   }
  });
 </script>
</dom-module>

<demo-test></demo-test>

上面的代码对某个 template 元素设置 is 属性为 dom-repeat,于是这个 template 元素内的东西就被循环了。这个循环根据在 template 元素上提供的 items 属性来遍历。注意 items 必须是数组,虽然用起来可能有点不太方便,但我觉得这个限制是一个非常好的做法。避免了像 Angular 那样使用 for-in 去遍历导致的各种问题。

items 的每一项,其索引和值会被放入 index 和 item 这两个属性中供 template 内的模板使用,于是上面的例子就输出了给定的索引和值。

然而 Polymer 的数据更新并不是基于脏数据比对,所以数据的动态更新可能就有点麻烦。比如我们有一个按钮,每次点击要增加一项的话应该这么写
运行

<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 placeholder="请输入内容" value="{{value::input}}" />
  <button on-click="append">添加一项</button>
  <ul>
   <template is="dom-repeat" items="[[data]]">
    <li>
     第 <strong>[[index]]</strong> 项,
     值为 <strong>[[item]]</strong>
    </li>
   </template>
  </ul>
 </template>
 <script>
  Polymer({
   is: 'demo-test',
   properties: {
    data: {
     type: Array,
     value: [ 'a', 'b', 'c', 'd' ]
    }
   },
   append: function() {
    // data.push(this.value); // 这么写是不行的
    this.push('data', this.value)
   }
  });
 </script>
</dom-module>

<demo-test></demo-test>

之前我们说过,Polymer 会将需要监控变化的数据作为一个访问器属性来设置,但如果改变数组的元素,实际上并没有对数组本身有任何改动。当我们把一个数组赋值给 VM 时实际上是把元素复制过去,而不是把数组对象丢过去。也就是说,这个数组对象并不直接是 VM 的引用,操作这个数组对象是无法影响 VM 的,所以直接对数组做 push 只是对数据的 push。

虽然数组自己的 push 方法无法操作 VM,但 Polymer 自己也提供了一些直接操作 VM 的方法,比如上面例子中的 this.push 就是 Polymer 提供的。它的操作模板不是一个对象,而是 VM 上的一个访问路径(比如上面例子中 push 的第一个参数 'data' 就是 VM 中 data 访问路径)。

除了 push 之外还有 pop、shift 等一些类似原生方法的操作(但要注意他们不是元素方法)。虽然操作起来确实不太方便,但也不至于到恶心的程度,反正我是勉强能接受的。

Javascript 相关文章推荐
Firebug 字幕文件JSON地址获取代码
Oct 28 Javascript
读jQuery之九 一些瑕疵说明
Jun 21 Javascript
推荐11款jQuery开发的复选框和单选框美化插件
Aug 02 Javascript
ASP.NET jQuery 实例6 (实现CheckBoxList成员全选或全取消)
Jan 13 Javascript
webapp框架AngularUI的demo改造之路
Dec 21 Javascript
javascript中 try catch用法
Aug 16 Javascript
Node.js + Redis Sorted Set实现任务队列
Sep 19 Javascript
JS 判断某变量是否为某数组中的一个值的3种方法(总结)
Jul 10 Javascript
Vue.js 中取得后台原生HTML字符串 原样显示问题的解决方法
Jun 10 Javascript
taro开发微信小程序的实践
May 21 Javascript
Vue 用Vant实现时间选择器的示例代码
Oct 25 Javascript
初学vue出现空格警告的原因及其解决方案
Oct 31 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
JavaScript中数组继承的简单示例
Jul 29 #Javascript
You might like
thinkphp整合系列之极验滑动验证码geetest功能
2019/06/18 PHP
20行代码实现的一个CSS覆盖率测试脚本
2013/07/07 Javascript
jQuery自动切换/点击切换选项卡效果的小例子
2013/08/12 Javascript
热点新闻滚动特效的js代码
2013/08/17 Javascript
使用jQueryMobile实现滑动翻页效果的方法
2015/02/04 Javascript
JS给超链接加确认对话框的方法
2015/02/24 Javascript
jQuery弹出层插件Lightbox_me使用指南
2015/04/21 Javascript
coffeescript使用的方式汇总
2015/08/05 Javascript
JS+CSS实现TreeMenu二级树形菜单完整实例
2015/09/18 Javascript
用jmSlip编写移动端顶部日历选择控件
2016/10/24 Javascript
vue项目搭建以及全家桶的使用详细教程(小结)
2018/12/19 Javascript
微信小程序外卖选购页实现切换分类与数量加减功能案例
2019/01/15 Javascript
JSON的parse()方法介绍
2019/01/31 Javascript
javascript设计模式 ? 简单工厂模式原理与应用实例分析
2020/04/09 Javascript
python&amp;MongoDB爬取图书馆借阅记录
2016/02/05 Python
Python实现压缩与解压gzip大文件的方法
2016/09/18 Python
Python md5与sha1加密算法用法分析
2017/07/14 Python
python与sqlite3实现解密chrome cookie实例代码
2018/01/20 Python
python实现手机销售管理系统
2019/03/19 Python
python3 selenium自动化测试 强大的CSS定位方法
2019/08/23 Python
Python OpenCV视频截取并保存实现代码
2019/11/30 Python
Python使用paramiko连接远程服务器执行Shell命令的实现
2021/03/04 Python
Nike挪威官网:Nike.com (NO)
2018/11/26 全球购物
正宗的日本零食和糖果订阅盒:Bokksu
2019/11/21 全球购物
Ajax实现页面无刷新留言效果
2021/03/24 Javascript
实习评语
2013/12/16 职场文书
生日宴会答谢词
2014/01/09 职场文书
管理专员自荐信
2014/01/26 职场文书
教育学习自我评价
2014/02/03 职场文书
2014年学生会个人工作总结
2014/11/07 职场文书
大学生毕业评语
2014/12/31 职场文书
婚礼答谢礼品
2015/01/20 职场文书
物流仓管员岗位职责
2015/04/01 职场文书
毕业实习证明范本
2015/06/16 职场文书
企业廉洁教育心得体会
2016/01/20 职场文书
温馨祝福晨语:美丽的一天从我的问候开始
2019/11/28 职场文书