MVVM (Model-View-ViewModel)
是一种用于把数据和UI分离的设计模式。
概念
Model表示应用程序使用的数据,比如一个用户账户信息(名字、头像、电子邮件等)。它并不具有任何行为逻辑,它只是数据,因而它不会对信息进行再次加工,不会影响浏览器展示数据。数据的格式化展示是由View处理的。
View是与用户进行交互的桥梁,它包括了一些数据绑定,事件,和行为,这些都会直接影响Model和ViewModel。
ViewModel充当数据转换器,可以被看作是MVC中的Controller,它主要负责数转换(用一定的业务逻辑),它负责将Model的变化反应到View上,而当View自身有变化时也会同步Model进行改变。你可以把ViewModel看作一个藏在View后面的好帮手,它把View需要的数据暴露给它,并且富于View一定的行为能力。
优点
- UI与逻辑的分离。
- 写unit测试比较方便,毕竟测ViewModel要比测个种Event方便多了。
清理思路
今天先来完成一个从model => view
的单项数据流,即当model改变的时候,view会自动更新。
顺便说一个套路,就是在写一个组件或者库的时候,要有面向接口编程的思路,什么意思? 就是在开始之前,要先考虑的是组件/库怎么被使用(别人怎么去调用),当然如果不用调用就能完成就更好了,手动滑稽。
假设有如下代码,data 里的name、job会和视图中大括号中的name、job一一映射,修改 data 里的值,会直接引起视图中对应数据的变化。
1 |
|
该如何通过实践MVVM来实现这种调用方式呢?结合前面预习过的数据劫持和观察者模式:
- 主题(subject)是什么?
- 观察者(observer)是什么?
- 观察者何时订阅主题?
- 主题何时通知更新?
主题应该是data的name和job属性,观察者是视图里大括号中的name、job;MVVM初始化的时候,去解析el模板里大括号中的name、job的时候订阅主题,当name和job发生改变的时候,通知观察者更新内容。
完整代码和注释
1 |
|
问题总结
在更新文本节点的时候,如果文本节点中存在和初始化变量值一样的内容,会被后面的更新替换掉,这一块需要再考虑考虑,如果你有的好的想法,欢迎交流。