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 相关文章推荐
javascript 操作select下拉列表框的一点小经验
Mar 20 Javascript
JS获取页面窗口大小的代码解读
Dec 01 Javascript
Knockoutjs的环境搭建教程
Nov 26 Javascript
window.showModalDialog参数传递中含有特殊字符的处理方法
Jun 06 Javascript
uploader秒传图片到服务器完整代码
Apr 22 Javascript
vue+canvas实现炫酷时钟效果的倒计时插件(已发布到npm的vue2插件,开箱即用)
Nov 05 Javascript
Vue自定义指令上报Google Analytics事件统计的方法
Feb 25 Javascript
JS浅拷贝和深拷贝原理与实现方法分析
Feb 28 Javascript
JavaScript实现背景自动切换小案例
Sep 27 Javascript
如何用JS模拟实现数组的map方法
Jul 30 Javascript
node中使用shell脚本的方法步骤
Mar 23 Javascript
JavaScript声明变量和数据类型的转换
Apr 12 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
最贵的咖啡是怎么产生的,它的风味怎么样?
2021/03/04 新手入门
关于PHP中Object对象的笔记分享
2011/06/28 PHP
PHP对文件进行加锁、解锁实例
2015/01/23 PHP
IE与Firefox下javascript getyear年份的兼容性写法
2007/12/20 Javascript
JS中产生20位随机数以0-9为例也可以是a-z A-Z
2014/08/01 Javascript
完美兼容各大浏览器的jQuery插件实现图片切换特效
2014/12/12 Javascript
完美兼容IE,chrome,ff的设为首页、加入收藏及保存到桌面js代码
2014/12/17 Javascript
JS HTML5实现拖拽移动列表效果
2020/08/27 Javascript
js生成word中图片处理方法
2018/01/06 Javascript
vue的传参方式汇总和router使用技巧
2018/05/22 Javascript
微信小程序实践之动态控制组件的显示/隐藏功能
2018/07/18 Javascript
Angular(5.2-&gt;6.1)升级小结
2018/12/27 Javascript
layui监听单元格编辑前后交互的例子
2019/09/16 Javascript
Vue基于iview实现登录密码的显示与隐藏功能
2020/03/06 Javascript
vue中实现图片压缩 file文件的方法
2020/05/28 Javascript
JavaScript交换变量常用4种方法解析
2020/09/02 Javascript
Python3实现的腾讯微博自动发帖小工具
2013/11/11 Python
Flask框架WTForm表单用法示例
2018/07/20 Python
对python当中不在本路径的py文件的引用详解
2018/12/15 Python
Python实现京东秒杀功能代码
2019/05/16 Python
Python在cmd上打印彩色文字实现过程详解
2019/08/07 Python
Python守护进程实现过程详解
2020/02/10 Python
在pycharm中关掉ipython console/PyDev操作
2020/06/09 Python
python和php哪个更适合写爬虫
2020/06/22 Python
Python3以GitHub为例来实现模拟登录和爬取的实例讲解
2020/07/30 Python
css3实现的下拉菜单效果示例
2014/01/22 HTML / CSS
柯基袜:Corgi Socks
2017/01/26 全球购物
结婚喜宴主持词
2014/03/14 职场文书
庆元旦文艺演出主持词
2014/03/27 职场文书
大三学习计划书范文
2014/05/02 职场文书
领导干部作风整顿剖析材料
2014/10/11 职场文书
教师批评与自我批评总结
2014/10/16 职场文书
社区端午节活动总结
2015/02/11 职场文书
《棉鞋里的阳光》教学反思
2016/02/20 职场文书
Nginx 502 Bad Gateway错误原因及解决方案
2021/03/31 Servers
javascript遍历对象的五种方式实例代码
2021/10/24 Javascript