[关闭]
@Wahson 2017-05-08T22:03:27.000000Z 字数 1355 阅读 1365

Polymer 2.0 observable 特性

前端技术


需求非常简单,实现一个跟Vue.js差不多的框架就行了。

那么既然这样,先看一个Polymer的痛点:

  1. <div>{{obj.a}}</div>
  2. <template is='dom-repeat' items='{{arr}}'>
  3. <li>{{item.ind}}</li>
  4. </template>

上面是<template>标签里的代码段,里面包含了一个对obj.a.c的双向绑定,以及对arr数组的绑定。考虑以下情况:当点击按钮(clickHandler)的时候,我们希望修改obj.a的值,并向arr添加新的数组项,并且希望这些修改反应到页面上。

以下使用polymer的标准方式的实现:

  1. class XElem extends Polymer.Element {
  2. ...
  3. static get properties(){
  4. return {
  5. obj:{
  6. type:Object,
  7. value:function(){
  8. return {};
  9. }
  10. },
  11. arr:{
  12. type:Array,
  13. value:function(){
  14. return [];
  15. }
  16. }
  17. };
  18. }
  19. clickHandler(e){
  20. //修改obj.a的值
  21. //方式1:
  22. this.obj.a = 1;
  23. this.notifyPath('obj.a'); //polymer base api
  24. //方式2:
  25. this.set('obj.a',1);
  26. //向arr添加元素
  27. this.arr.push({ind:1});
  28. this.notifySplices('arr'); //polymer base api
  29. }
  30. }

这种方式大家估计应该非常熟悉了。但是这种方式看起来非常麻烦,而且不符合习惯。那么接下来,为了让修改对象和数组变得更加自然一些,我们给Polymer2.0添加了observable特性。

先来看一下用法:

  1. class XElem extends Polymer.Element {
  2. ...
  3. static get properties(){
  4. return {
  5. obj:{
  6. type:Object,
  7. observable:true
  8. },
  9. arr:{
  10. type:Array,
  11. observable:true
  12. }
  13. };
  14. }
  15. clickHandler(){
  16. //对象
  17. this.obj = {a:{c:1}};
  18. this.obj.a = {c:2};
  19. this.obj.a.c = 3;
  20. //数组
  21. this.arr = [{ind:1}];
  22. //添加元素
  23. this.arr.push({ind:2});
  24. //修改元素
  25. this.arr[0] = {ind:3};
  26. this.arr[0].ind = 4; //不支持
  27. //删除元素
  28. this.arr.splice(2,1)
  29. this.arr.pop();
  30. }
  31. }

用法非常简单:
1、在定义properties的时候,像定义type和value一样,定义observable:true
2、然后修改对象和数组就按照日常操作对象和数组的方式,无需再调用notifyPath和notifySplices了。

nestedObserve特性相关代码:
https://github.com/mrLeung/polymer/commit/e337992abc92bd63c937ffaf98cdb8f0709f17a3
核心代码函数_addObservableEffect

添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注