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 相关文章推荐
jQuery UI-Draggable 参数集合
Jan 10 Javascript
在jQuery 1.5中使用deferred对象的代码(翻译)
Mar 10 Javascript
一个简单的全屏图片上下打开显示网页效果示例
Jul 08 Javascript
Javascript 拖拽的一些简单的应用(逐行分析代码,让你轻松了拖拽的原理)
Jan 23 Javascript
vue-router跳转页面的方法
Feb 09 Javascript
详谈jQuery中的一些正则匹配表达式
Mar 08 Javascript
手淘flexible.js框架使用和源代码讲解小结
Oct 15 Javascript
vue中导出Excel表格的实现代码
Oct 18 Javascript
深入浅析js原型链和vue构造函数
Oct 25 Javascript
koa+mongoose实现简单增删改查接口的示例代码
May 13 Javascript
Layui数据表格跳转到指定页的实现方法
Sep 05 Javascript
webpack常用配置总览(小结)
Nov 18 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
蝙蝠侠:侠影之谜
2020/03/04 欧美动漫
php中hashtable实现示例分享
2014/02/13 PHP
两种php去除二维数组的重复项方法
2015/11/04 PHP
PHP输出图像imagegif、imagejpeg与imagepng函数用法分析
2016/11/14 PHP
php实现当前页面点击下载文件的实例代码
2016/11/16 PHP
PHP多进程编程之僵尸进程问题的理解
2017/10/15 PHP
Laravel timestamps 设置为unix时间戳的方法
2019/10/11 PHP
PHP学习记录之常用的魔术常量详解
2019/12/12 PHP
用Div仿showModalDialog模式菜单的效果的代码
2007/03/05 Javascript
js中数组(Array)的排序(sort)注意事项说明
2014/01/24 Javascript
JavaScript操作cookie类实例
2015/03/31 Javascript
jQuery实现点击弹出背景变暗遮罩效果实例代码
2016/06/24 Javascript
超全面的JavaScript开发规范(推荐)
2017/01/21 Javascript
JS简单判断字符在另一个字符串中出现次数的2种常用方法
2017/04/20 Javascript
基于vue.js的分页插件详解
2017/11/27 Javascript
Node使用Sequlize连接Mysql报错:Access denied for user ‘xxx’@‘localhost’
2018/01/03 Javascript
Vue框架之goods组件开发详解
2018/01/25 Javascript
jquery ajax加载数据前台渲染方式 不用for遍历的方法
2018/08/09 jQuery
vue ssr 实现方式(学习笔记)
2019/01/18 Javascript
Nodejs实现微信分账的示例代码
2021/01/19 NodeJs
Python线程下使用锁的技巧分享
2018/09/13 Python
基于django和dropzone.js实现上传文件
2020/11/24 Python
使用CSS3设计地图上的雷达定位提示效果
2016/04/05 HTML / CSS
茵宝(Umbro)英国官方商店:英国足球服装生产商
2016/12/29 全球购物
乌克兰鞋类购物网站:Eobuv.com.ua
2020/11/28 全球购物
说出数据连接池的工作机制是什么?
2013/04/19 面试题
优秀员工个人的自我评价
2013/11/29 职场文书
中专生毕业个人鉴定
2014/02/26 职场文书
青年标兵事迹材料
2014/08/16 职场文书
离婚协议书范文2015
2015/01/26 职场文书
幼儿园中班教师个人总结
2015/02/05 职场文书
优秀共产党员主要事迹材料
2015/11/05 职场文书
2016年敬老月活动总结
2016/04/05 职场文书
如何撰写创业策划书
2019/06/27 职场文书
react国际化react-intl的使用
2021/05/06 Javascript
oracle覆盖导入dmp文件的2种方法
2021/05/21 Oracle