一,mvc是什么???
M: model(数据模型)负责所有的数据
V:view(视图)负责所有的UI界面
C: controller(控制器)负责其他
最小知识原则:
引入的模块越少越好
二、EventBus
2.1 EventBus 是什么?
EventBus 主要用于对象之间的通信,比如在上面的例子中,Model 数据模型 和 View 视图模型彼此不知道彼此的存在,但是又需要通信,于是就要用到 EventBus 总结:使用 eventBus 可以满足最小知识原则,m 和 v 互相不知道对方的细节,但是却可以调用对方的功能
2.2 EventBus 有哪些 API?
eventBus 提供了 on、off 和 trigger 等 API,on 用于监听事件,trigger 用于触发事件
比如在上面的 MVC 模型中, M 数据模型更新时,会 trigger 触发一个事件。
const m = {
....
update(data) {
Object.assign(m.data, data)
eventBus.trigger('m:updated') // 通知一下view层,我已经更新了数据,view该开始工作了
localStorage.setItem('n', m.data.n)
},
....
}
然后在 controller,controller 会用 on 监听事件, 然后通知 view 模型去重新渲染页面
const c = {
init(container) {
v.init(container)
v.render(m.data.n) // view = render(data)
c.autoBindEvents()
eventBus.on('m:updated', () => { // controller会用 on 监听事件,
//然后通知 view 模型去重新渲染页面
console.log('here')
v.render(m.data.n)
})
},
...
}
model驱动开发
实际开发中,常常会以view为核心,页面上需要展示什么数据,就去model中设置数据源。发生了用户事件,我会在action中更新model,然后刷新view。有时候会遗漏更新model,直到需要数据时才发现没有保存到model中。
model本身是独立的,自控制的,不依赖于view,能够同步支持多view的显示。就像linux上的应用程序通常会提供图形界面和命令行两种操作方式一样。那如果以model为核心,model驱动开发,数据在手、天下我有,以模型验证保证数据的完整性和正确性。实现数据绑定,任何对模型的更改都会在界面上反映出来。那我们只要预先写好view和model的关系映射(类似viewmodel),然后只关注模型数据,就OK了。