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的更新,也是經過框架中的觀察者模式實現的。