模型model用于封装与应用程序的业务逻辑相关的数据以及对数据的处理方法,会有一个或多个视图监听此模型。一旦模型的数据发生变化,模型将通知有关的视图。
//示例let Model={data:{数据源},create:{增加数据},delete:{删除数据},update(data){Object.assign(m.data,data)//用新数据替换旧数据eventBus.trigger('m:update')//eventBus触发'm:update'信息,通知View刷新界面},get:{获取数据}}
视图view是它在屏幕上的表示,描绘的是model的当前状态。当模型的数据发生变化,视图相应地得到刷新自己的机会。
//示例let View={el:要刷新的元素,html:'要显示在页面上的内容'init(){v.el:需要刷新的元素},render(){刷新页面}}
控制器controller定义用户界面对用户输入的响应方式,起到不同层面间的组织作用,用于控制应用程序的流程,它处理用户的行为和数据model上的改变。
//示例let Controller={init(){v.init()//初始化Viewv.render()//第一次渲染页面c.autoBindEvents()//自动的事件绑定eventBus.on('m:update',()=>{v.render()}//当enentsBus触发'm:update'是View刷新},events:{事件以哈希表的方式记录存储},method(){data=新数据m.update(data)},autoBindEvents(){自动绑定事件}}
EventBus的作用
模块通信
解决模块之间通信的问题,view组件层面,父子组件、兄弟组件通信都可以使eventbus处理
模块解耦
storage change事件,cookie change事件,view组件的事件等,全部转换使用Event Bus来订阅和发布,这样就统一了整个应用不同模块之间的通信接口问题。
父子页面通信
window.postMessage + Event Bus
多页面通信
storage change + Event Bus
EventBus的一些常用api
on(监听事件)trigger(触发事件)off(取消监听)eventBus.trigger('m:updated') // 触发事件,大叫'm 已经更新了'eventBus.on('m:updated', () => { console.log('here') }) '监听事件,听到后执行函数'
模块化
在一个完整的页面应用中,不同的节点功能,不同的结构可以规划为多个模块,每个模块的实现的方式以及用到的技术大不相同,使用模块化编程可以减小各个模块之间的影响和联系,可以更方便的优化代码和重构代码,提高我们代码的重用性,便于后期维护
