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 文本框使用小结
May 22 Javascript
JS判断元素为数字的奇异写法分享
Aug 01 Javascript
Jquery多选框互相内容交换的实例代码
Jul 04 Javascript
JavaScript将字符串转换为整数的方法
Apr 14 Javascript
轻量级jQuery插件slideBox实现带底栏轮播(焦点图)代码
Mar 28 Javascript
Javascript简写条件语句(推荐)
Jun 12 Javascript
利用node.js制作命令行工具方法教程(一)
Jun 22 Javascript
详解vue-cli + webpack 多页面实例配置优化方法
Jul 13 Javascript
vue router导航守卫(router.beforeEach())的使用详解
Apr 19 Javascript
layui radio单选限制下一个radio单选的实例
Sep 03 Javascript
vue.js实现只能输入数字的输入框
Oct 19 Javascript
Element Dialog对话框的使用示例
Jul 26 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
使用 MySQL 开始 PHP 会话
2006/12/21 PHP
探讨PHP删除文件夹的三种方法
2013/06/09 PHP
ecshop 2.72如何修改后台访问地址
2015/03/03 PHP
服务器迁移php版本不同可能诱发的问题
2015/12/22 PHP
ThinkPHP3.1.x修改成功与失败跳转页面的方法
2017/09/29 PHP
JQuery动态给table添加、删除行 改进版
2011/01/19 Javascript
事件委托与阻止冒泡阻止其父元素事件触发
2014/09/02 Javascript
仅30行代码实现Javascript中的MVC
2016/02/15 Javascript
JS导出PDF插件的方法(支持中文、图片使用路径)
2016/07/12 Javascript
基于cookie实现zTree树刷新后展开状态不变
2017/02/28 Javascript
ES6中Math对象新增的方法实例详解
2017/04/25 Javascript
jQuery使用zTree插件实现可拖拽的树示例
2017/09/23 jQuery
js仿微信抢红包功能
2020/09/25 Javascript
node通过npm写一个cli命令行工具
2017/10/12 Javascript
微信小程序HTTP请求从0到1封装
2019/09/09 Javascript
Vue移动端实现图片上传及超过1M压缩上传
2019/12/23 Javascript
Python中使用动态变量名的方法
2014/05/06 Python
python实现获取客户机上指定文件并传输到服务器的方法
2015/03/16 Python
Python多线程threading和multiprocessing模块实例解析
2018/01/29 Python
详解Django的model查询操作与查询性能优化
2018/10/16 Python
PyQt5实现简单数据标注工具
2019/03/18 Python
numpy.meshgrid()理解(小结)
2019/08/01 Python
基于TensorFlow中自定义梯度的2种方式
2020/02/04 Python
不到20行实现Python代码即可制作精美证件照
2020/04/24 Python
Python中无限循环需要什么条件
2020/05/27 Python
python使用建议与技巧分享(二)
2020/08/17 Python
CSS3 中的@keyframes介绍
2014/09/02 HTML / CSS
解决HTML5中的audio在手机端和微信端的不能自动播放问题
2019/11/04 HTML / CSS
ROSEFIELD手表荷兰官方网上商店:北欧极简设计女士腕表品牌
2018/01/24 全球购物
最新茶叶店创业计划书
2014/01/14 职场文书
党支部书记先进事迹
2014/01/17 职场文书
在校生自我鉴定
2014/01/23 职场文书
军神教学反思
2014/02/04 职场文书
小学生开学第一课活动方案
2014/03/27 职场文书
内勤岗位职责范本
2015/04/13 职场文书
八年级数学教学反思
2016/02/17 职场文书