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 相关文章推荐
js控制iframe的高度/宽度让其自适应内容
Apr 09 Javascript
iScroll中事件点击触发两次解决方案
Mar 11 Javascript
jQuery实现鼠标划过添加和删除class的方法
Jun 26 Javascript
学习使用AngularJS文件上传控件
Feb 16 Javascript
JS添加删除DIV的简单实例
Jul 08 Javascript
深入浅析Vue组件开发
Nov 25 Javascript
利用webstrom调试Vue.js单页面程序的方法教程
Jun 06 Javascript
在Angular中使用JWT认证方法示例
Sep 10 Javascript
axios 封装上传文件的请求方法
Sep 26 Javascript
jQuery加PHP实现图片上传并提交的示例代码
Jul 16 jQuery
js面向对象封装级联下拉菜单列表的实现步骤
Feb 08 Javascript
vue完美实现el-table列宽自适应
May 08 Vue.js
浅谈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
php5.2.0内存管理改进
2007/01/22 PHP
PHP设计模式之工厂方法设计模式实例分析
2018/04/25 PHP
针对PHP开发安全问题的相关总结
2019/03/22 PHP
javascript自动改变文字大小和颜色的效果的小例子
2013/08/02 Javascript
JavaScript中判断两个字符串是否相等的方法
2015/07/07 Javascript
jQuery mobile转换url地址及获取url中目录部分的方法
2015/12/04 Javascript
jQuery对象与DOM对象转换方法详解
2016/05/10 Javascript
jQuery事件对象总结
2016/10/17 Javascript
浅谈js键盘事件全面控制
2016/12/01 Javascript
基于JavaScript实现轮播图原理及示例
2020/04/10 Javascript
详解Web使用webpack构建前端项目
2017/09/23 Javascript
浅谈js获取ModelAndView值的问题
2018/03/28 Javascript
基于VuePress 轻量级静态网站生成器的实现方法
2018/04/17 Javascript
jQuery常见的遍历DOM操作详解
2018/09/05 jQuery
javascript实现遮罩层动态效果实例
2019/05/14 Javascript
ant-design-vue中的select选择器,对输入值的进行筛选操作
2020/10/24 Javascript
[03:28]2014DOTA2国际邀请赛 EG战队官方纪录片
2014/07/21 DOTA
LRUCache的实现原理及利用python实现的方法
2017/11/21 Python
利用Python暴力破解zip文件口令的方法详解
2017/12/21 Python
基于windows下pip安装python模块时报错总结
2018/06/12 Python
python利用requests库模拟post请求时json的使用教程
2018/12/07 Python
10个示例带你掌握python中的元组
2020/11/23 Python
UGG美国官网:购买UGG雪地靴、拖鞋和鞋子
2017/12/31 全球购物
成都思必达公司C#程序员招聘面试题
2013/06/26 面试题
毕业生求职简历的自我评价
2013/10/07 职场文书
个人自我评价和职业目标
2014/01/24 职场文书
3.15国际消费者权益日主题活动活动总结
2014/03/16 职场文书
庆六一宣传标语
2014/10/08 职场文书
学校党的群众路线教育实践活动总结材料
2014/10/30 职场文书
2015毕业生自我评价范文
2015/03/02 职场文书
土建技术员岗位职责
2015/04/11 职场文书
建筑工地资料员岗位职责
2015/04/13 职场文书
男人帮观后感
2015/06/18 职场文书
上手简单,功能强大的Python爬虫框架——feapder
2021/04/27 Python
MySQL REVOKE实现删除用户权限
2021/06/18 MySQL
使用Python解决图表与画布的间距问题
2022/04/11 Python