本文目录一览:
- 1、js中的双向数据绑定是什么意思
- 2、js设计模式-观察者模式来模拟vue的双向数据绑定
- 3、实现双向数据绑定
- 4、AngularJS的数据双向绑定是怎么实现的
- 5、js实现数据双向绑定
- 6、Vue.js入门教程(三)双向绑定和数据渲染
js中的双向数据绑定是什么意思
双向数据绑定指的就是,绑定对象属性的改变到用户界面的变化的能力,反之亦然。换种说法,如果我们有一个user对象和一个name属性,一旦我们赋了一个新值给user.name,在UI上就会显示新的姓名了。同样地,如果UI包含了一个输入用户姓名的输入框,输入一个新值就应该会使user对象的name属性做出相应的改变。
详细的解释和例子可以看下这篇文章,,希望对你有帮助
js设计模式-观察者模式来模拟vue的双向数据绑定
vue的双向数据绑定大家应该很熟悉了,当一方的值发生改变时,另一方绑定的值也会随之变化,用起来是挺嗨的。
但是在原生中我们怎么使用这种机制呢?
最近有个需求是通过对接websocket获取后台服务器实时变化的值,推送给web端使用。
基于这个需求,我使用到了js中的设计模式-观察者模式。
那么,让我们来一起了解一下吧。
先来看看具体机制:
这里对象定义了四个属性,分别绑定四个函数。
1、订阅:订阅方通过传递回调函数,观察者模式把这个回调函数push到自身的订阅功能里,以此来得知谁订阅了,然后判断是否要推送。
2、退订:找到对应的回调函数,然后在自身的订阅功能里把当前函数删除掉
3、发布:循环所有的订阅方,当发布方进行发送的时候,把对应的数据推送给订阅方
4、发布订阅:定义一个对象,使其具备订阅并且发布的功能
流程是这样,说起来头头是道的,问题是怎么使用?
举个栗子:
我想定义一个对象,使其具备发布订阅功能,发布方数值改变的时候,订阅方得到平方值得变化
这里通过input框的change事件,模拟了数据的实时变更,然后把当前值进行发布,这边一发布,订阅方就能通过回调函数得到实时变化的值,然后得到值进行相应的操作。
效果:
这样就能简单实现数据变更推送功能了。
注:文件中引入的observer的js是最上面提到的观察者模式的那一套流程,tools的js大家可以不必在意,是我自己原生封装的$函数,用来获取dom元素的。
具体需求,大家还需要变通,稍作修改。
好了,以上就是js的观察者模式实现的双向数据绑定。
如有问题,请指出,接受批评。
实现双向数据绑定
MVVM框架主要包含3个部分: model 、 view 和 viewmodel 。
简单的来说,就是框架的控制器层(这里的控制器层是一个泛指,可以理解为控制view行为和联系model层的中间件)和UI展示层(view层)建立一个双向的数据通道。当这两层中的任何一方发生变化时,另一层将会自动作出相应的变化。
一般来说要实现这种双向数据绑定,在前端我目前了解的有三种形式:
目前angular,regular的实现都是基于脏检查。当发生某些特定的事情的时候,框架会调用相关的digest方法。内部逻辑就是遍历所有的 watcher ,对监控的属性做对比。如果值发生了变化,则执行相应的 handler 。
当系统进入脏检查阶段,遍历所有的 $watch 绑定的 watcher ,然后对比 watcher.get() 与 watcher.last ,如果不同则运行对应的 watcher.fn(newvalue, oldvalue) 。然后再进入下一个watcher的检查。
何时进行脏检查?
由于regularjs是基于脏检查,所以当不是由regularjs本身控制的操作(如事件、指令)引起的数据操作,可能需要你手动的去同步data与view的数据. $update方法即帮助将你的data同步到view层.
]( )元素来控制你的观察者数量。
使用ES7中的 Object.observe 方法对对象(或者其属性)进行监控观察,一旦其发生变化时,将会执行相应的handler。这是目前监控属性数据变更最完美的一种方法,语言(浏览器)原生支持,没有什么比这个更好了。唯一的遗憾就是目前支持广度还不行,有待全面推广。
vue.js和avalon.js实现数据双向绑定的原理就是属性访问器。
它使用了ES5中的定义标准属性的Object.defineProperty 方法。
Object.defineProperty 使用示例:
首先,vuejs在实例化的过程中,会对遍历传给实例化对象选项中的data 选项,遍历其所有属性并使用 Object.defineProperty 把这些属性全部转为 getter/setter。
同时每一个实例对象都有一个watcher实例对象,他会在模板编译的过程中,用getter去访问data的属性,watcher此时就会把用到的data属性记为依赖,这样就建立了视图与数据之间的联系。当之后我们渲染视图的数据依赖发生改变(即数据的setter被调用)的时候,watcher会对比前后两个的数值是否发生变化,然后确定是否通知视图进行重新渲染。这样就实现了所谓的双向数据绑定。
AngularJS的数据双向绑定是怎么实现的
它们将模板和数据合并起来加入到视图中去,如图表中所示。合并完成之后,从图中的流向可以看出,任何对数据模型或者相关内容的改变都不会自动反映到视图中去。而且用户对视图的任何改变也不会自动同步到数据模型中来。这意味着,开发者需要编写代码来保持视图与模板、模板与视图的同步,无疑增加了开发的工作量。
那么有没有可以自动实现这种双向机制的框架,有,请看:
下图:双向绑定
AngularJS的数据绑定是数据模型(model)与视图(view)组件的自动同步。Angular的实现方式允许你把应用中的模型看成单一数据源。而视图始终是数据模型的一种展现形式。当模型改变时,视图就能反映这种改变,反之亦然。
js实现数据双向绑定
我们主要通过ES5中的 Object.defineProperty 实现,主要是利用里面的 get 和 set 来实现数据双向绑定
以上没满足知识量的可查看详情 : 双向绑定原理详情
以上就是对ES5中Object.defineProperty实现双向数据绑定的理解
Vue.js入门教程(三)双向绑定和数据渲染
既然清楚了原理,那么,接下来进入正题——我知道了vue怎么安装,那么我怎么使用呢?
在告诉你基础用法之前,我还是要先告诉你一个情况。
可能要令你有点失望。vue主要是侧重于数据端的。他的目的就是渲染数据和在前端调整一下数据逻辑。
他不是像jquery那样让你用来做特技的。就算你要做特技。你也应该通过css3/canvas而不是dom。
所谓的双向绑定,你可以理解就是把view。(你还不清楚mvc的话,请看第一章)
和model绑定到一起。说白了,就是你js中的绑定值变了。你dom中的内容就跟着一块变了。
vue是通过解析{{文字..}}来生成内容的。后面绑定方法,输出内容的时候都会讲到。
列表输出使用 v-for,这些v开头加横杠的叫做命令
这些命令是可以自定义的。但是那都属于高级操作,我们不用它也完全足够支撑做一个大型项目了。
其实你回发现,这里无论是v-for或者是v-什么其他玩意
它都深刻的遵循了es6的语法。这里不就是一个典型的for in 循环吗。不过我们现在都用for of了。
你记住这个用法,它就长这样。
前后端分离开发的关键在于:后台只提供接口。
我们获得的数据多数情况下,仅仅是一个json,而mvvm的关键就再于解析数据在前端完成了。如果你了解jsp或者php你会了解,数据的解析在mvc中,
是由后端完成的,而html只负责显示。
所以,当你了解了数据绑定和渲染以后,你可以第一时间先把数据输出到页面了。
我们前端最厉害的地方不就是处理能看得见的东西吗?