60行之內寫mvc

標題黨。幾天前看到一個30行寫mvc的文章,東施效顰,也動手寫了個60行的,功能上略微擴充一些,記錄下來,後面有時間能夠繼續優化。html

mvc實際上是一個觀察者模式。view來監聽model,因此當model的數據有變化的時候,view能夠自動更新視圖。架構

 

既然view來監聽model,那麼是否是能夠擴展一下,若是頁面上多個模塊同時使用一個數據源,也就是同時使用一個model的時候,是否能夠讓這些模塊的mvc

view都來監聽這一個model,這樣當model的數據發生變化時,監聽該model的views們 視圖同時也都發生了變化呢,確定是能夠的。測試

 

根據這個思路,花了差很少兩個晚上的時間,寫完了一個基本的雛形。優化

先看model。this

function Model (value) {
      this.value = value || '';
      // idList保存的是 監聽該model的view的id, 該idList示例:[{viewid1: {event1: function(){.....}}},{viewid2: {}}]
      this.idList = [];
  };

  // 當model的數據變化的時候,監聽model的view發生對應的變化
  Model.prototype.changeValue = function (value) {
      var that = this;
      that.value = value;
      var idList = that.idList;

      for (var k in idList) {
        if (idList[k]) {
          for (var j in idList[k]) {
            idList[k][j].call(this, value);
          }
        }
      }
  };

下面是viewspa

function View (id, eventList) {
      this.id = id;
      this.eventList = eventList || {};
  }
  // view基於model的事件,當model的數據變化時,view會經過這些事件
  // 進行視圖的改變
  View.prototype.setEventList = function (eventList, model) {
      var that = this;
      that.eventList = eventList;
      that.subscribeModel(model);
  };
  // view訂閱model 這樣能夠保證多個view公用一個model
  View.prototype.subscribeModel = function (model) {
    var that = this;
    var id = that.id;
    model.idList[id] = that.eventList;
  };

view裏面並無什麼過於複雜的原理。prototype

最後是controller,其實這個controller 可擴展性是很強的,由於只是簡單的練習,controller裏我並無加太多的東西。code

function Controller (model, view) {
    this.model = model;
    this.view = view;
  }

  Controller.prototype.trigger = function () {
    this.view.subscribeModel(this.model);
  };

寫了點html實驗一下 OK的htm

// 如下是測試的代碼
var view = new View ('block', {
    'changeContent': function (data) {
        document.getElementById('block').innerHTML = data;
    }
  });

  var model = new Model();


  var controller = new Controller(model, view);
  controller.trigger();

  model.changeValue('data111');

這裏是有個問題的,就是當model裏有默認的數據時,是沒有去渲染view的,後續能夠再修改。

經過這個簡單的例子,主要是更加清楚model和view的關係。目前機遇mv的架構有不少,但基本原理都是同樣的。

相關文章
相關標籤/搜索