1 function Model(value) {
2 this._value = typeof value === 'undefined' ? '' : value;
3 this._listeners = [];
4 }
5 Model.prototype.set = function (value) {
6 var self = this;
7 self._value = value;
8 setTimeout(function () {
9 self._listeners.forEach(function (listener) {
10 listener.call(self, value);
11 });
12 });
13 };
14 Model.prototype.watch = function (listener) {
15 this._listeners.push(listener);
16 };
17 Model.prototype.bind = function (node) {
18 this.watch(function (value) {
19 node.innerHTML = value;
20 });
21 };
22 function Controller(callback) {
23 var models = {};
24 var views = Array.prototype.slice.call(document.querySelectorAll('[bind]'), 0);
25 views.forEach(function (view) {
26 var modelName = view.getAttribute('bind');
27 (models[modelName] = models[modelName] || new Model()).bind(view);
28 });
29 callback.call(this, models);[mw_shl_code=applescript,true]<span bind="hour"></span> : <span bind="minute"></span> : <span bind="second"></span>
30 // controller:
31 new Controller(function (models) {
32 function setTime() {
33 var date = new Date();
34 models.hour.set(date.getHours());
35 models.minute.set(date.getMinutes());
36 models.second.set(date.getSeconds());
37 }
38 setTime();
39 setInterval(setTime, 1000);
40 });
1 function Model(value) {
2 this._value = typeof value === 'undefined' ? '' : value;
3 this._listeners = [];
4 }
5 Model.prototype.set = function (value) {
6 var self = this;
7 self._value = value;
8 setTimeout(function () {
9 self._listeners.forEach(function (listener) {
10 listener.call(self, value);
11 });
12 });
13 };
14 Model.prototype.watch = function (listener) {
15 this._listeners.push(listener);
16 };
17 Model.prototype.bind = function (node) {
18 this.watch(function (value) {
19 node.innerHTML = value;
20 });
21 };
22 function Controller(callback) {
23 var models = {};
24 var views = Array.prototype.slice.call(document.querySelectorAll('[bind]'), 0);
25 views.forEach(function (view) {
26 var modelName = view.getAttribute('bind');
27 (models[modelName] = models[modelName] || new Model()).bind(view);
28 });
29 callback.call(this, models);[mw_shl_code=applescript,true]<span bind="hour"></span> : <span bind="minute"></span> : <span bind="second"></span>
30 // controller:
31 new Controller(function (models) {
32 function setTime() {
33 var date = new Date();
34 models.hour.set(date.getHours());
35 models.minute.set(date.getMinutes());
36 models.second.set(date.getSeconds());
37 }
38 setTime();
39 setInterval(setTime, 1000);
40 });
能够看出,controller中只负责更新model的逻辑,和view彻底解耦;而view和model的绑定是经过view中的属性和框架中controller的初始化代码完成的,也没有出如今业务逻辑中;至于view的更新,也是经过框架中的观察者模式实现的。