对MVC的简单理解

139 阅读2分钟

 一,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了。