MVVM模式

来源:http://www.cnblogs.com/shawnhu/archive/2017/12/01/7923702.html
-Advertisement-
Play Games

MVVM是一種前端框架模式,框架模式主要是用來管理與組織代碼,在複雜應用中,利用高內聚低耦合的思想,將代碼分離組織到不同部分,每部分都有其關註點和職責,各部分間耦合度低,達到“關註點分離”目的,使整個應用更易管理、維護,每個部分可以單獨更新、替換以及復用,從而達到整個應用的模塊化。 一、概念 MVV ...


  MVVM是一種前端框架模式,框架模式主要是用來管理與組織代碼,在複雜應用中,利用高內聚低耦合的思想,將代碼分離組織到不同部分,每部分都有其關註點和職責,各部分間耦合度低,達到“關註點分離”目的,使整個應用更易管理、維護,每個部分可以單獨更新、替換以及復用,從而達到整個應用的模塊化。

一、概念

  MVVM是公認的模式,要點是雙向綁定技術和ViewModel,雙向綁定更方便你同時維護頁面上都依賴於某個欄位的N個區域,而不用手動更新它們;而ViewModel用來粘合View和Model,讓它們進一步分離和解耦,其主要由以下幾部分組成:

    View :顯示數據和接受用戶操作,與ViewModel中的數據,雙向綁定,觸發ViewModel中的事件,純凈的html代碼,不夾雜或引用JS代碼。

  Model : 領域對象,提供業務數據以及對數據的邏輯處理,其在實際開發中,可能是來自多個介面的Dto對象,畢竟資料庫結構對象不能向外暴露。

  ViewModel :View和Model的連接器,讓Model更加適合於View,ViewModel把Model的數據根據View所需的格式進一步轉化,使View可以直接綁定,如把來自多個介面的DTO對象,進一步加工成ViewModel數據,其可以直接雙向綁定到View,是真正將頁面與數據邏輯分離的模式。UI層也有邏輯,這些邏輯都放在ViewModel中,所以MVVM是也是富客戶端的模式。另外,View中元素的事件綁定到ViewModel中定義的方法。

  總之,Model獲取到原始數據,ViewModel進一步 加工,View直接顯示,另外其中的網路操作可以分離到單獨的類或服務中,ViewModel的方法響應View中事件,調用網路操作Model。

二、優點

  低耦合:View可以獨立於Model變化和修改,同一個ViewModel可以給多個View復用,可以做到View和Model變化互不影響。

  可重用:可以把一些視圖邏輯放在ViewModel中,讓多個View復用。

  獨立開發:開發人員可以專註於業務邏輯和數據開發(ViewModel),界面設計人員可以專註於View的設計。

  可測試性:清晰的View分層,使得表現層的業務邏輯測試更簡單和容易。

三、與MVC比較

  1、MVC的View與業務邏輯關聯緊密,直接訪問Model,View包含Model,MVVM的View與Model松耦合,數據直接從ViewModel中獲取綁定。

  2、MVC操作流程

    用戶操作 -> View(負責接收用戶的輸入操作)->Controller(業務邏輯處理)->Model(數據持久化)->View(將結果反饋給View)

    

 

  3、MVVM操作流程

    用戶操作 -> View(負責接收用戶的輸入操作)->ViewModel(綁定數據以及綁定方法自動執行)->Model(數據更新或持久化)->ViewModel(從獲取更新後進一步加工數據)->View(雙向綁定ViewModel數據)

    

 

四、AngularJS與MVVM

  View :專註於界面的顯示和渲染,即包含一堆聲明式Directive(指令)的視圖模板。

  Model :領域對象,與業務邏輯相關的數據的封裝載體,不包含任何與界面顯示相關的邏輯,Model不關心自己會被如何顯示或操作,大部分Model都是來自於WebApi介面返回的數據或全局配置對象,AngularJS中的Service正是封裝和處理這些與Model相關的業務邏輯的最佳方式,這些領域對象可以被Controller或其他Service復用。

  ViewModel :讓View和Model進一步分離和解耦,負責View和Model的交互和協作,它負責給View提供顯示數據,以及供View操作Model的途徑,AngularJS中$scope充當了ViewModel角色,$scope可以添加數據和交互行為函數,數據來源分兩種,一種是展現信息的業務數據,直接從Model中獲取,另一種是描述交互的派生數據,如某個保存按鈕在編輯模式下才顯示,可以定義一個$scoe.isEdit來控制保存按鈕顯示隱藏,開始是false,點編輯按鈕後設置為true,View中保存按鈕用ng-show='isEdit'綁定該數據來顯示。

  Controller :不是MVVM中的核心元素,但是在AngularJS中用來負責ViewModel即$scope的初始化,調用一個或多個Model相關的Serive來獲取領域對象,還可以綁定上View中的交互事件,如ng-click事件,事件相應方法中調用Model相關Serive來操作Model。

可見View不能和Model直接交互,而是通過$scope這個ViewModel來實現與Model交互的。

五、KnockoutJS與MVVM

  通過一個函數來創建表示ViewModel的類,需要綁定的數據和函數將作為該類的成員。

  ViewModel:

  

  View:

  

 

 

 

 

     

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • Pipeline使用了groovy語法,同時可以使用所有jenkins插件在groovy里進行調用,可以說通過UI可以實現的功能使用pipeline也可以實現,這一點我在上一篇文章里已經說明,今天主要說一下pipeline里的公用類庫,你可以自己定義方法,一般地一個方法一個文件,擴展名為groovy ...
  • 各位朋友好,本章節我們繼續講第五個設計模式。 在生活中,我們都知道手機記憶體卡是無法直接接電腦的,因為記憶體卡的卡槽比較小,而電腦只有USB插孔,此時我們需要用到讀卡器。這個讀卡器就相當於是適配器。這是生活上的適配器,那麼在OO對象中,適配器就是將一個介面轉換成另一個介面,使得客戶可以使用。 適配器模式 ...
  • 一、背景&問題 之前框架是一個基於SOA思想設計的分散式框架。各應用通過服務方式提供使用,服務之間通信是RPC方式調用,具體實現基於.NET的WCF通信平臺。框架存在如下2個問題: 1、高併發處理能力不足。一當高併發請求,可能出現多個服務待定處理,導致整個系統出現瓶頸。 2、隨著移動端廣泛應用,服務 ...
  • 上一章我們學習了裝飾者模式,這章LZ帶給大家的是單例模式。 首先單例模式是用來幹嘛的?它是用來實例化一個獨一無二的對象!那這有什麼用處?有一些對象我們只需要一個,比如緩存,線程池等。而事實上,這類對象只能有一個示例,如果製造多個示例,就會導致許多問題產生,比如程式的行為異常,資源使用過量。而單例模式 ...
  • ////發表時間(now) function p(s) { return s < 10 ? '0' + s : s; } var myDate = new Date(); //獲取當前年 var year = myDate.getFullYear(); //獲取當前月 var month = myD ...
  • 原文地址: "簡潔後臺管理模版" 之前給客戶開發一個簡單的後臺管理系統,本來準備套用AdminLTE的,但客戶嫌棄太臃腫,而且又需要有多tab頁面切換,於是從我代碼庫中找到好久前就寫過的管理後臺,根據需求重寫。這是基於jQuery,加上自己編寫基礎樣式,從零搭建起來的框架,在這個輕量級模版的基礎上進 ...
  • 網上找了很多版本嘗試都不行,最後在stackoverflow上找到一個,嘗試完美解決 具體操作步驟如下 1. 安裝jquery npm install jquery 2.安裝 type for jquery npm install -D @types/jquery 3.在組件中使用jquery im ...
  • 1.main.js 2.fs模塊,讀寫文件 3.http請求模塊 4.schedule.js, 任務調度模塊 5.sendQQemail.js,發送QQ郵件模塊 6.先簡單記錄下,以後有空再詳細說明 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...