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 相关文章推荐
PJ Blog修改-禁止复制的代码和方法
Oct 25 Javascript
ajaxControlToolkit AutoCompleteExtender的用法
Oct 30 Javascript
浅析JavaScript中的类型和对象
Nov 29 Javascript
jquery 删除字符串最后一个字符的方法解析
Feb 11 Javascript
原生JS实现平滑回到顶部组件
Mar 16 Javascript
关于function类中定义变量this的简单说明
May 28 Javascript
JavaScript鼠标事件,点击鼠标右键,弹出div的简单实例
Aug 03 Javascript
node+experss实现爬取电影天堂爬虫
Nov 20 Javascript
vue2.0的contextmenu右键弹出菜单的实例代码
Jul 24 Javascript
浅析vue-router jquery和params传参(接收参数)$router $route的区别
Aug 03 jQuery
vue实现路由懒加载的3种方法示例
Sep 01 Javascript
JS时间戳与日期格式互相转换的简单方法示例
Jan 30 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删除目录及目录下所有文件的方法详解
2013/06/06 PHP
codeigniter框架The URI you submitted has disallowed characters错误解决方法
2014/05/06 PHP
PHP利用二叉堆实现TopK-算法的方法详解
2017/04/24 PHP
JS字符串函数扩展代码
2011/09/13 Javascript
JS中的substring和substr函数的区别说明
2013/05/07 Javascript
元素绑定click点击事件方法
2015/06/08 Javascript
学习javascript文件加载优化
2016/02/19 Javascript
easyui combobox开启搜索自动完成功能的实例代码
2016/11/08 Javascript
利用n工具轻松管理Node.js的版本
2017/04/21 Javascript
AngularJS中的promise用法分析
2017/05/19 Javascript
javascript 取小数点后几位几种方法总结
2017/08/02 Javascript
详解如何实现一个简单的 vuex
2018/02/10 Javascript
原生JS forEach()和map()遍历的区别、兼容写法及jQuery $.each、$.map遍历操作
2019/02/27 jQuery
vue2 v-model/v-text 中使用过滤器的方法示例
2019/05/09 Javascript
Vuex新手的理解与使用详解
2019/05/31 Javascript
js JSON.stringify()基础详解
2019/06/19 Javascript
Vue实现商品详情页的评价列表功能
2019/09/04 Javascript
[41:52]2018DOTA2亚洲邀请赛3月29日 小组赛A组 TNC VS OpTic
2018/03/30 DOTA
python删除字符串中指定字符的方法
2018/08/13 Python
python实现文件助手中查看微信撤回消息
2019/04/29 Python
python设计tcp数据包协议类的例子
2019/07/23 Python
python pandas利用fillna方法实现部分自动填充功能
2020/03/16 Python
numpy库reshape用法详解
2020/04/19 Python
django数据模型中null和blank的区别说明
2020/09/02 Python
Django xadmin安装及使用详解
2020/10/26 Python
Python实现异步IO的示例
2020/11/05 Python
丹尼尔惠灵顿手表天猫官方旗舰店:Daniel Wellington
2017/08/25 全球购物
改变生活的男士内衣:SAXX Underwear
2019/08/28 全球购物
《手指教学》反思
2014/02/14 职场文书
小学开学典礼主持词
2014/03/19 职场文书
2014小学二年级班主任工作总结
2014/12/05 职场文书
篮球拉拉队口号
2015/12/25 职场文书
教师读书活动心得体会
2016/01/14 职场文书
《抽屉原理》教学反思
2016/02/20 职场文书
Python下opencv库的安装过程及问题汇总
2021/06/11 Python
win11开机发生死循环重启怎么办?win11开机发生死循环重启解决方法
2022/08/05 数码科技