MVC 三个对象分别做什么
- M 是 Model,数据模型,负责数据相关的任务
- V 是 View,视图,负责用户界面
- C 是 Controller,控制器,负责监听用户事件,然后调用 M 和 V 更新数据和视图
代码示例
const m = {
data: {
n: parseFloat(localStorage.getItem('n'))
},
create() {},
delete() {},
update(data) {
Object.assign(m.data, data)
eventBus.trigger('m:updated')
localStorage.setItem('n', m.data.n)
},
get() {}
}
const v = {
el: null,
html: `
<div>
<div class="output">
<span id="number">{{n}}</span>
</div>
<div class="actions">
<button id="add1">+1</button>
<button id="minus1">-1</button>
<button id="mul2">*2</button>
<button id="divide2">÷2</button>
</div>
</div>
`,
init(container) {
v.el = $(container)
},
render(n) {
if (v.el.children.length !== 0) v.el.empty()
$(v.html.replace('{{n}}', n))
.appendTo(v.el)
}
}
const c = {
init(container) {
v.init(container)
v.render(m.data.n)
c.autoBindEvents()
eventBus.on('m:updated', () => {
v.render(m.data.n)
})
},
events: {
'click #add1': 'add',
'click #minus1': 'minus',
'click #mul2': 'mul',
'click #divide2': 'div',
},
add() { m.update({n: m.data.n + 1}) },
minus() { m.update({n: m.data.n - 1}) },
mul() { m.update({n: m.data.n * 2}) },
div() { m.update({n: m.data.n / 2}) },
autoBindEvents() {
for (let key in c.events) {
const value = c[c.events[key]]
const spaceIndex = key.indexOf(' ')
const part1 = key.slice(0, spaceIndex)
const part2 = key.slice(spaceIndex + 1)
v.el.on(part1, part2, value)
}
}
}
EventBus
- 主要用于组件/对象间通信
- 常用API:on、trigger、off
import $ from 'jquery'
let eventBus = $(window)
eventBus.trigger('m:updated')
eventBus.on('m:updated', () => {
v.render(m.data.n)
})
eventBus.off('m:updated', () => {
console.log("关闭了")
})
表驱动编程
- 通过哈希表将事件抽象出来,简化了代码,降低了重复率,这就是表驱动。(示例:Controller示例)