表現與數據分離

    表現與數據分離?表現與結構分離?初級開發者遇到這個詞彙大家應該聯想到,表現與結構分離,表現應該由CSS來控制,就是css與HTML分開嘛。表現與數據分離應該就是CSS與JS分離???其實不然。

初級web開發通常會利用JS獲取頁面的ID或class獲取頁面的DOM,然後進行動態交互或渲染頁面,但是,當後序升級中將包含該id的DOM刪除了,那麼這個時候就會報錯。特別是ajax的大量運用,1)對頁面元素的class id等元素選擇器分散在代碼各個地方,沒有抽象出來。2)對於ajax異步獲取的數據,也沒有對數據持久層分離,基本都是按功能分散在代碼中各個部分。3)經常在html中鑲嵌大量JS運用代碼而且是JS主要功能代碼,使代碼分散不宜維護。簡小的頁面還可以維護,如果是大的項目該如何處理呢?這時候就應用到了表現與數據分離。

        W3C標準中有規定,網頁主要由三部分組成:結構(Structure)、表現(Presentation)和行爲(Behavior),它們應該是相互分離的,便於後期的開發和維護。我理解的表現與數據分離是javaScript中的MVC,用JavaScript負責填充數據,HTML負責表現數據。下面我們先說一說MVC的概念:

       採用MVC開發的最初目的就是讓表現與數據分離。MVC 是一種使用 MVC(Model View Controller 模型-視圖-控制器)設計創建 Web 應用程序的模式, Model(模型)負責在數據庫中存取數據。View(視圖)顯示數據。Controller(控制器)控制器負責從視圖讀取數據,控制用戶輸入,並向模型發送數據,保證視圖與模型數據同步更新。

如何實現JavaScript的MVC呢???

下面舉個栗子:select一個選項,並將該選項在後臺所對應的數據顯示在select下方。

<!DOCTYPE html>
<html lang="en">
<head>
	<meta charset="UTF-8">
	<title>表現與數據分離</title>
	<script src="https://cdn.bootcss.com/jquery/1.10.2/jquery.min.js"></script>
	<script type="text/javascript">
	$(document).ready(function(){
		var controller = {
			start: function() {
				this.view.start();
			},
			set: function(type) { //將view上變化的數據映射到model上
                 controller.model.set(type);
			}
		};
		controller.model ={
			// 初始化model
			data: {
				‘古典文學‘: ‘三國演義‘,
				‘現代文學‘: ‘悲傷逆流成河‘,
				‘西方文學‘: ‘紅與黑‘},
            currentType: null,
            // 初始化model結束

            // 響應來自controller的數據變化
            set: function(type) {
            	this.currentType = this.data[type];
            	this.change(this.currentType);
            },
            change: function(book) {
            	controller.view.undate(book); //將modle變化後有關view的數據映射到view上,該函數外包爲change
            }
		};
		controller.view = {
			// 監聽頁面數據變化
           start: function() {
              $("#menu").change(this.changeHandler);
           },
           // 將變化的數據映射到model上
           changeHandler: function() {
           	controller.set($("#menu").val());
           },
           undate: function(book){ // 響應來自model的數據
             $("#show").html(book);
           }
		};

		controller.start();  //開啓controller
	});

	</script>
</head>
<body>
  <select id="menu">
    <option value="menu">古典文學</option>
    <option value="現代文學">現代文學</option>
    <option value="西方文學">西方文學</option>
  </select>
<div id="show"></div>
</body>
</html>

    首先創建一個Controller對象,該controller對象即可以監聽view的數據變化,也可以將view的變化數據響應到model中,最終將model變化的數據更新到view。其結構如下:

         技術分享

 

實現表現與數據分離的優點和缺點:

       優點是: 模塊化 --> 容易測試 --> 降低bug頻率

       缺點是:程序結構複雜,比較耗時,上手有學習曲線

應用場景:

       項目具有明顯的數據需求,比如要與很多Service交互,業務流程複雜,表單很多

非應用場景:

      項目是典型的靜態信息展示型頁面,或是微型的內部app,或是產品idea驗證時期的MVP。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章