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 BS,dialog控件自适应大小
Jul 06 Javascript
Javascript的数组与字典用法与遍历对象的属性技巧
Nov 07 Javascript
node+express+ejs制作简单页面上手指南
Nov 26 Javascript
node.js操作mongoDB数据库示例分享
Nov 26 Javascript
JS实现模拟百度搜索“2012世界末日”网页地震撕裂效果代码
Oct 31 Javascript
javascript 数组的定义和数组的长度
Jun 07 Javascript
浅析JS获取url中的参数实例代码
Jun 14 Javascript
Jquery树插件zTree实现菜单树
Jan 24 Javascript
JavaScript仿微信打飞机游戏
Jul 05 Javascript
Layui选项卡制作历史浏览记录的方法
Sep 28 Javascript
jQuery实现手风琴效果(蒙版)
Jan 11 jQuery
一篇文章带你搞懂Vue虚拟Dom与diff算法
Aug 25 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
php cURL和Rolling cURL并发方式比较
2013/10/30 PHP
php实现面包屑导航例子分享
2015/12/19 PHP
PHP+MySQL高并发加锁事务处理问题解决方法
2018/04/30 PHP
浅谈php的TS和NTS的区别
2019/03/13 PHP
自定义Laravel (monolog)日志位置,并增加请求ID的实现
2019/10/17 PHP
jquery.validate使用攻略 第五步 正则验证
2010/07/01 Javascript
js控制表单奇偶行样式的简单方法
2013/07/31 Javascript
jQuery ajax serialize() 方法使用示例
2014/11/02 Javascript
node.js中的fs.write方法使用说明
2014/12/15 Javascript
使用npm发布Node.JS程序包教程
2015/03/02 Javascript
jQuery中serializeArray()与serialize()的区别实例分析
2015/12/09 Javascript
JavaScript位置与大小(1)之正确理解和运用与尺寸大小相关的DOM属性
2015/12/26 Javascript
js显示动态时间的方法详解
2016/08/20 Javascript
vue配置font-awesome5的方法步骤
2019/01/27 Javascript
vue-devtools的安装和使用步骤详解
2019/10/17 Javascript
详解JS深拷贝与浅拷贝
2020/08/04 Javascript
解决vue watch数据的方法被调用了两次的问题
2020/11/07 Javascript
[02:18]DOTA2英雄基础教程 育母蜘蛛
2014/01/20 DOTA
[03:46]显微镜下的DOTA2第七期——满血与残血
2014/06/20 DOTA
[45:34]完美世界DOTA2联赛PWL S3 Rebirth vs CPG 第一场 12.18
2020/12/19 DOTA
python自动化unittest yaml使用过程解析
2020/02/03 Python
python3实现往mysql中插入datetime类型的数据
2020/03/02 Python
Python脚本调试工具安装过程
2021/01/11 Python
从Pytorch模型pth文件中读取参数成numpy矩阵的操作
2021/03/04 Python
css3 实现元素弧线运动的示例代码
2020/04/24 HTML / CSS
HTML5 Canvas渐进填充与透明实现图像的Mask效果
2013/07/11 HTML / CSS
英国鹦鹉店:Parrot Essentials
2018/12/03 全球购物
学习决心书范文
2014/03/11 职场文书
高三上学期学习自我评价
2014/04/23 职场文书
房地产端午节活动方案
2014/08/24 职场文书
2015年世界环境日活动总结
2015/02/11 职场文书
个人德育工作总结
2015/03/05 职场文书
工伤事故赔偿协议书
2015/08/06 职场文书
《秋天的怀念》教学反思
2016/02/17 职场文书
职工趣味运动会开幕词
2016/03/04 职场文书
实习报告范文之电话客服岗位
2019/07/26 职场文书