博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
【ife】动态数据绑定(三)自己的实现
阅读量:6430 次
发布时间:2019-06-23

本文共 1769 字,大约阅读时间需要 5 分钟。

题目

深层次数据变化如何逐层往上传播?

let app2 = new Observer({    name: {        firstName: 'shaofeng',        lastName: 'liang'    },    age: 25});app2.$watch('name', function (newName) {    console.log('我的姓名发生了变化,可能是姓氏变了,也可能是名字变了。')});app2.data.name.firstName = 'hahaha';// 输出:我的姓名发生了变化,可能是姓氏变了,也可能是名字变了。app2.data.name.lastName = 'blablabla';// 输出:我的姓名发生了变化,可能是姓氏变了,也可能是名字变了。

观察到了吗?firstName 和 lastName 作为 name 的属性,其中任意一个发生变化,都会得出以下结论:"name 发生了变化。"这种机制符合”事件传播“机制,方向是从底层往上逐层传播到顶层。

这现象想必你们也见过,比如:“点击某一个DOM元素,相当于也其父元素和其所有祖先元素。”(当然,你可以手动禁止事件传播) 所以,这里的本质是:"浏览器内部实现了一个事件传播的机制",你有信心自己实现一个吗?


我的代码

function Observer(obj) {  this.data = obj; // 对象挂载点  this.$p = Array.prototype.slice.call(arguments,1)[0] || 'data'; // 实现事件冒泡储存父级 名字  this.transformAll(obj); // 对obj对象进行 遍历, 然后调用convat 进行defineProperty改写}Observer.prototype.transformAll = function(obj) {  var keyarr = Object.keys(obj);  for (var i=0,len=keyarr.length;i

、、。


实现方式

在动态数据绑定(二)中需要实现一个事件系统,我的实现是在原型链上建立一个content属性保存所有需要绑定的事件名称触发函数.如下:

Observer.prototype.content = {}

事件系统应该是能监听所有的实例化对象绑定的函数,在判断改写和深度convat当中都会创建一个新的实例化对象,如果写到this上就无法通用了。

还有一个痛点是如何知道父级对象的key值,好在函数里面对基本类型和对象类型的区分十分明了,只要在检测到是对象类型的哪一条路上多传入一个参数,传入当前的属性的key给下层,下层再利用这个key就好了。

想要得到冒泡,触发事件的时候就一定要携带上父级的key信息,我使用了

new Observer(value,this.$p + '.' + key);
set: function(newval){      var allkey = $p+ '.' + key;      console.log('你设置了 '+ key + ', ' + '新的值为 ' + newval);      self.emit(allkey, newval);  // 触发形式为 father.child    newval为传入信息      if (newval instanceof Object ) {        new Observer(newval, allkey);  // 如果改写为对象      }      val =  newval    }

emit($p+ '.' + key, newval),触发的时候就变成了data.name.firstName的形式,传入的$p一定是保存着所有上层的key值,接着再在emit函数内部解析一下 ,触发datanamefirstName即可。

有个问题,现在函数的执行顺序是由上到下了,明天写个setTimeout,刚好可以加深理解js的任务循环机制?

写的很乱,脖子和腰都在抗议了,抽空从第一个任务写起来,今天先合电脑睡觉??

转载地址:http://zbiga.baihongyu.com/

你可能感兴趣的文章
转: Visual Studio 调试小技巧(1)-根据字符串内容添加断点
查看>>
使用javascript实现多个图片漂浮的效果(完善火狐滤镜功能)
查看>>
关于图像特征提取【转】
查看>>
asp.net<C#> web service Object moved to here.
查看>>
瑞典皇家理工学院工程类表
查看>>
HP大中华区总裁孙振耀退休感言(转)
查看>>
查看OS位数
查看>>
移动设备数据访问技术三
查看>>
4.6.2 万能转换器boost::lexical_cast
查看>>
让linux开机自动执行一条需要管理员的密码的命令
查看>>
一个帮助你在触摸设备上使用jQuery UI的JS类库 - jQuery UI Touch Punch
查看>>
java 正则 块转义,忽略大小写,匹配换行模式,匹配先前匹配的文本(解释正则运行机制)...
查看>>
我最喜欢的打字键盘_雷柏1800套装
查看>>
ORACLE 表空间扩展方法
查看>>
KMP算法模板
查看>>
override 和 重载的区别?
查看>>
怎样通过iPhone Safari 来安装测试版ipa
查看>>
[python] <type 'exceptions.UnicodeDecodeError'>: 'ascii' codec can't decode byte 0xe5 in position 9
查看>>
java中的io
查看>>
『AA』AutoAnchor自动猫
查看>>