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代码
Jan 11 Javascript
js 数组去重的四种实用方法
Sep 09 Javascript
jquery代码实现多选、不同分享功能
Jul 31 Javascript
JavaScript判断DIV内容是否为空的方法
Jan 29 Javascript
使用jQuery操作HTML的table表格的实例解析
Mar 13 Javascript
js滚轮事件兼容性问题需要注意哪些
Nov 15 Javascript
基于zepto.js实现手机相册功能
Jul 11 Javascript
jQuery插件实现弹性运动完整示例
Jul 07 jQuery
微信小程序实现张图片合成为一张并下载
Jul 16 Javascript
JavaScript闭包相关知识解析
Oct 19 Javascript
Json实现传值到后台代码实例
Jun 30 Javascript
javascript使用正则表达式实现注册登入校验
Sep 23 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动态生成VRML网页
2006/10/09 PHP
PHP 采集程序原理分析篇
2010/03/05 PHP
php生成随机密码的几种方法
2011/01/17 PHP
phpmailer在服务器上不能正常发送邮件的解决办法
2014/07/08 PHP
PHP图片处理之图片旋转和图片翻转实例
2014/11/19 PHP
ThinkPHP中数据操作案例分析
2015/09/27 PHP
PHP常用字符串操作函数实例总结(trim、nl2br、addcslashes、uudecode、md5等)
2016/01/09 PHP
分享几种好用的PHP自定义加密函数(可逆/不可逆)
2020/09/15 PHP
javascript Window及document对象详细整理
2011/01/12 Javascript
给jqGrid数据行添加修改和删除操作链接(之一)
2011/11/04 Javascript
批量实现面向对象的实例代码
2013/07/01 Javascript
jQuery中:lt选择器用法实例
2014/12/29 Javascript
bootstrapfileinput实现文件自动上传
2016/11/08 Javascript
微信小程序 转发功能的实现
2017/08/04 Javascript
javascript简写常用的12个技巧(可以大大减少你的js代码量)
2020/03/28 Javascript
vue系列之动态路由详解【原创】
2017/09/10 Javascript
使用Electron构建React+Webpack桌面应用的方法
2017/12/15 Javascript
vue.js使用3DES加密的方法示例
2018/05/18 Javascript
vue-cli项目使用mock数据的方法(借助express)
2019/04/15 Javascript
angular4应用中输入的最小值和最大值的方法
2019/05/17 Javascript
解决vue 使用axios.all()方法发起多个请求控制台报错的问题
2020/11/09 Javascript
gearman的安装启动及python API使用实例
2014/07/08 Python
python写xml文件的操作实例
2014/10/05 Python
利用numpy+matplotlib绘图的基本操作教程
2017/05/03 Python
python单例模式实例解析
2018/08/28 Python
python实现写数字文件名的递增保存文件方法
2018/10/25 Python
django-rest-framework 自定义swagger过程详解
2019/07/18 Python
python基于exchange函数发送邮件过程详解
2020/11/06 Python
.NET面试问题集
2015/12/08 面试题
高中教师先进事迹材料
2014/08/22 职场文书
遗嘱继承权公证书
2015/01/26 职场文书
预备党员入党感想
2015/08/10 职场文书
社区宣传标语口号
2015/12/26 职场文书
68句权威创业名言
2019/08/26 职场文书
国庆节到了,利用JS实现一个生成国庆风头像的小工具 详解实现过程
2021/10/05 Javascript
MySQL的存储函数与存储过程的区别解析
2022/04/08 MySQL