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 相关文章推荐
特殊字符、常规符号及其代码对照表
Jun 26 Javascript
json 实例详细说明教程
Oct 31 Javascript
JQuery自定义事件的应用 JQuery最佳实践
Aug 01 Javascript
在JS中解析HTML字符串示例代码
Apr 16 Javascript
淘宝网提供的国内NPM镜像简介和使用方法
Apr 17 Javascript
深入浅析JavaScript中prototype和proto的关系
Nov 15 Javascript
微信小程序  modal详解及实例代码
Nov 09 Javascript
JS表格组件神器bootstrap table使用指南详解
Apr 12 Javascript
three.js实现3D模型展示的示例代码
Dec 31 Javascript
vue项目中导入swiper插件的方法
Jan 30 Javascript
Vue表单之v-model绑定下拉列表功能
May 14 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
html中select语句读取mysql表中内容
2006/10/09 PHP
php读取文件内容的三种可行方法示例介绍
2014/02/08 PHP
Thinkphp中的volist标签用法简介
2014/06/18 PHP
php禁止浏览器使用缓存页面的方法
2014/11/07 PHP
深入解析PHP的Yii框架中的缓存功能
2016/03/29 PHP
Laravel框架查询构造器简单示例
2019/05/08 PHP
jQuery chili图片远处放大插件
2009/11/30 Javascript
用js实现table单元格高宽调整,兼容合并单元格(兼容IE6、7、8、FF)实例
2013/06/25 Javascript
JavaScript如何获取数组最大值和最小值
2015/11/18 Javascript
node.js连接mongoDB数据库 快速搭建自己的web服务
2016/04/17 Javascript
jQuery实现下拉框功能实例代码
2016/05/06 Javascript
JavaScript常见的五种数组去重的方式
2016/12/15 Javascript
JS遍历对象属性的方法示例
2017/01/10 Javascript
简单谈谈require模块化jquery和angular的问题
2017/06/23 jQuery
Bootstrap实现下拉菜单多级联动
2017/11/23 Javascript
JS随机数产生代码分享
2018/02/24 Javascript
如何获取TypeScript的声明文件.d.ts
2018/05/01 Javascript
如何解决.vue文件url引用文件的问题
2019/01/18 Javascript
[04:44]DOTA2 2017全国高校联赛视频回顾
2017/08/21 DOTA
[04:54]DOTA2 2017国际邀请赛:上届冠军WINGS采访短片
2017/08/09 DOTA
[01:31:02]TNC vs VG 2019国际邀请赛淘汰赛 胜者组赛BO3 第一场
2019/08/22 DOTA
Python中函数的参数定义和可变参数用法实例分析
2015/06/04 Python
python @classmethod 的使用场合详解
2019/08/23 Python
python同时替换多个字符串方法示例
2019/09/17 Python
python爬虫中的url下载器用法详解
2020/11/30 Python
HTML5 input元素类型:email及url介绍
2013/08/13 HTML / CSS
Bench加拿大官方网站:英国城市服装品牌
2017/11/03 全球购物
Dillard’s百货官网:Dillards.com
2018/05/26 全球购物
毕业生造价工程师求职信
2013/10/17 职场文书
给民警的表扬信
2014/01/08 职场文书
大学生职业生涯规划书模板
2014/01/18 职场文书
小学毕业家长寄语
2014/01/19 职场文书
国贸专业的职业规划范文
2014/01/23 职场文书
听证通知书
2015/04/24 职场文书
幼儿园亲子活动感想
2015/08/07 职场文书
导游词之香港-太平山顶
2019/10/18 职场文书