首先最大的问题就是我们如何去知道data里面的数据变化了,在Vue的实例化对象的data属性当中,可以查看到该属性上存在着一个get和set方法,而这两个方法实际上是通过Object.defineProperty()来实现数据劫持的。
先来实现一个简单的需求,创建一个简单的对象。
但是现在我想要在获取到Book.name的时候有个书名号包裹着该怎么办呢?这就需要用到上文说到的Object.defineProperty()了。
通过Object.defineProperty( )设置了对象Book的name属性,对其get和set进行重写 *** 作,get就是在读取name属性这个值触发的函数,set就是在设置name属性这个值触发的函数。而在控制台输出的Book对象,乍一看,和Vue的数据长得有点类似,说明Vue确实是通过这种方法来实现数据的劫持的,那么我们就可以实现一个监听器observer了。
有了observer方法,我们就能够去实现监听Vue实例化对象的data属性值是否发生了更改,也就是说在Vue类当中调用observer方法即可,但是现在只是知道了哪个属性发生了变化,却无法实时的更新,要想实现这一步,我们先来考虑一个问题,当某一个属性值发生变化的时候,是需要将所有绑定该属性值的节点的值改为该属性值,所以这就用到了发布和订阅模式,也就是说,绑定同一个属性的每一个订阅者都存放在同一个订阅器内,如果该属性值变化了,订阅器会逐个的发布告知每一个订阅者。(更多详细信息请自行百度或参考 lk儒家 博客)
根据理解,很容易的清楚的知道需要一个订阅者容器类,该类的实例化对象必须含有一个数组,然后有一个向该数组存放订阅者的方法,以及循环该数组通知所有订阅者更新的方法。
而对于订阅者,上文也进行分析了,也很清楚的知道每一个订阅者的实例上都存在着一个update方法,即更新其内容,而再仔细想一想,这些订阅者到底是什么,更新的是什么内容呢?是不是每一个绑定Vue的属性的节点都是一个订阅者,改变的是该节点的内容,也就是说,这些订阅者是在上篇文章当中compile的时候去创建,需要的参数值是Vue的实例化对象,绑定的该节点以及绑定的Vue的属性值。
而现在我们剩下的问题就是observer和Watcher并没有关联到一起,细心的小伙伴可能已经发现了在Watcher类当中进行了一句初始化 *** 作,而执行update方法为什么属于初始化呢?可以发现,在update方法当中是将this.vm.data[this.name]赋值给节点内容,而this.vm.data[this.name]早已经被监听了,即其会在赋值之前先执行该Vue实例化对象data属性的get方法,所以向订阅者容器当中添加订阅者的 *** 作就是在监听的get方法当中,那么又该如何区分是否是需要添加的呢,这里可以在Watcher类当中添加一个标识,例如Dep.target,因为这个是全局的,所以在每一次 *** 作完后就要对该值释放。
到此为止,整个Vue的双向绑定原理基本上说完了,但是运行发现,当修改输入框内容的时候,绑定同样属性值的内容根本就没有变化,这是由于没有给输入框绑定keyup事件,在该事件当中,只需要将输入框的内容赋值给Vue实例化对象的data中的绑定属性即可。
最后,奉上一张逻辑图,加深理解,biubiu!
数据库同步最典型的应用是异地容灾、负担主库查询统计,这一般是1对1的应用,但是多维同步的需求有时也会浮出水面,这方面的需求一般来说更有实际应用价值,大致分为以下几种:1、N->1型:这种需求主要是应用于分部将生产数据上传到总部,可以让总部实时了解生产调拨情况以及各分部计划完成情况来进行集中分析使用当然同步的前提是各分部业务数据同步的表必须是独立的,或者数据的主键是不冲突的,这样多组日志在执行的时候就不会出现内部干扰的情况,此种方式必须从应用上进行隔离,保证数据的独立性。
2、1->N型:这种需求是第一种情况的逆过程,主要是应用于总部将通知发布到各分部的应用。目的是一些重要的通知,报表数据,当业务数据没有实现大集中情况下需要分发到分部,当然,这种需求一般会要求同步软件能够配置哪些表或者哪些字段的数据需要定向同步到哪个备库,这就需要同步软件需要具备进行表过滤或者字段过滤功能。 3、N<->N型:这种情况应用不多,但是特点是网络结构复杂,还需要应用上的配合。一个简单的例子就是跨国企业多国联合生产系统。比如A国是总部,B国是分部1,C国是分部2,D国是分部3。当一个生产计划从总部下发到BCD分部时,各分部就得到了生产数据,同时根据总计划制定各自的生产计划,之后每个分部可以针对自身独立的部分进行生产,同时每个分部会把各自计划完成的情况实时传到总部,之后由总部进行区分,比如把CD产生的生产数据同步到B,把BC产生的生产数据同步到D,把BD产生的数据同步到C,这样就完成一个生产计划的分布控制,同时各分部可以根据相临分部生产计划的执行情况对自己的生产任务进行调整。
可以说N<->N模式是目前最复杂的一种应用,不止要从应用系统上保持同步数据的一致和无冲突性,还要保证数据能够在多向传输中的所有断点记录,并且在实际应用过程中还会有根据用户、字段、表进行过滤和转化的一系列需求,甚至还会涉及到各国字符编码的转换问题。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)