首頁 web前端 js教程 js實作一個簡單的MVVM框架範例分享

js實作一個簡單的MVVM框架範例分享

Jan 16, 2018 pm 01:12 PM
javascript mvvm 框架

本文主要為大家分享一篇js實作一個簡單的MVVM框架範例,具有很好的參考價值,希望對大家有幫助。一起跟著小編過來看看吧,希望能幫助大家。

以前都是默默地看園子裡的文章,猥瑣的點贊,今天也分享一下自己用js實現的一個簡單mvvm框架。

最初只做了自動綁定事件,後面又參考學習了vue,knouckout以及argular實現方式,以及結合自己做WPF的一些經驗,增加了屬性綁定,今天又稍微整理了下,完善了部分功能,把程式碼提交到了碼雲:https://gitee.com/zlj_fy/Simple-MVVM

先簡單介紹下用法:

<form class="form-horizontal" role="form" data-context="TestController">
  <p class="form-group">
   <legend>Form title</legend>
  </p>
  <p class="form-group">
   <p class="col-sm-6 col-sm-offset-2">
    <input type="text" class="form-control" bind-val="age,format=format" style="margin:5px 0" />
    <input type="text" class="form-control" bind-val="desc" style="margin:5px 0" />
    <input type="range" min="10" max="300" bind-val="age" step="10" class="form-control" style="margin:5px 0" />
    <input type="button" class="btn btn-primary" value="更新" style="margin:5px 0" on-click="update" />
   </p>
  </p>
 </form>
 <script>
  var TestController = {
   data: {
    name: 'xiaoming',
    age: 3,
    desc: function() {
            return this.name + ' likes looking little movie. he should take care of his body' 
    }
   },
   format: function(val) {
    return val + '岁'
   },
   update: function() {
    this.name = 'this is a test'
    this.age = 18
   }
  }
  $('body').controller()
 </script>
登入後複製

先定義一個控制器,可以是json對象,也可一是一個function,然後在頂層的元素定義data-context=“[控制器名稱]”就可以將該控制器綁定到該節點底下所有元素。如果元素後代存在嵌套Controller,則其所在的元素以下子元素作用域指向子控制器。

1.監控屬性以及複雜屬性

所有屬性必須定義在data節點下,如果裡面的屬性定義成function則認為是複雜屬性(例如desc),複雜屬性是唯讀的,重新賦值的話會提示錯誤。

綁定到html元素上的格式:"{屬性名稱,fomat=[控制器方法]}",屬性名稱支援嵌套屬性,例如(a.b);屬性名稱不支援表達式,考慮了覺得不是很必要,完全可以使用複雜屬性去代替,當前缺點是業務複雜的話可能造成大量複雜屬性;屬性名稱右邊是可選參數,目前只有format,也就是屬性顯示在html上的轉換方法。

2.指令

綁定指令語法是bind-{指令}的形式,目前只實作了val,attr,text,html,template,其實可以看出,前面4個都只是簡單封裝了jqeury方法,template是用到了jquery-tmpl插件實現的,如果你需要更多的指令,你可以自己去擴展,只需要實現init初始加載方法(接收當前的observer參數),以及update方法(參數說明:對應的jquery元素,最新的值,目前控制器實例);如果是擴充已有的指令,預設會覆寫原有的。如下:

$.controller.addDirective("val", {
  init: function (observer) {
   if (observer.$ele.is('input,select')) {
    //监听onchange事件
    observer.$ele.on('input propertychange', function () {
     var newVal = $(this).val()
     observer.writeValue(newVal)
    })
   }
  },
  update: function ($ele, newVal, controller) {
   $ele.val && $ele.val(newVal)
  }
 })
登入後複製

3.事件

綁定事件語法:on-{事件}=“{控制器方法},type=on/one”,控制器方法右邊是可選參數,目前只有綁定型別on/one,預設是on;控制器方法接收兩個參數,一個是可以在對應事件的元素上設定初始參數,一個是event事件參數;

<button type="button" class="btn btn-primary" data-page="1" on-click="refesh">查询</button>
登入後複製

4.方法

直接使用this.屬性名,就可以直接存取對應data節點下的屬性。

5.鉤子

init以及created,init是在監聽所有屬性之後編譯dom之前,可以在這方法上初始化參數;created是編譯dom元素之後。

其中控制器預設實作了extend繼承方法,可以繼承另一個控制器,必須在init方法中使用。目前你也可以自己使用原型繼承的方式去實現。

init: function () {
    this.extend(PageController)
   },
   created: function () {
    //TODO
   },
登入後複製

6.擴展

相信大家在做專案的時候一定都會有一套公用的元件,那麼可以像下面那樣擴展,預設對應的元件掛載到所有的控制器範例下面,就可以之間在對應的方法下直接呼叫了: this.http.post();

不過有一個建議,就是盡量統一將回調方法的作用域指向控制器,這樣開發不至於老是出現作用域的問題。

$.controller.extend({
   utils: utils,
   notify: $.notify,
   modal: $.modal,
   http: $.http,
   alert: $.alert
  })
登入後複製

7.原理以及程式碼分析(待續...)

整個js程式碼量只有300多行,所以實現的比較簡單,有很多方面是沒有考慮到的,還有一些功能是想實現卻沒有去做的,目前不支援數組變化檢測,以及局部更新相關dom。

相關推薦:

分別介紹MVC、MVP和MVVM是什麼

什麼是MVVM架構和資料綁定?

Vue.js 與 MVVM 的注意事項

#

以上是js實作一個簡單的MVVM框架範例分享的詳細內容。更多資訊請關注PHP中文網其他相關文章!

本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

SublimeText3 Mac版

SublimeText3 Mac版

神級程式碼編輯軟體(SublimeText3)

如何評估Java框架商業支援的性價比 如何評估Java框架商業支援的性價比 Jun 05, 2024 pm 05:25 PM

評估Java框架商業支援的性價比涉及以下步驟:確定所需的保障等級和服務等級協定(SLA)保證。研究支持團隊的經驗和專業知識。考慮附加服務,如昇級、故障排除和效能最佳化。權衡商業支援成本與風險緩解和提高效率。

PHP 框架的學習曲線與其他語言框架相比如何? PHP 框架的學習曲線與其他語言框架相比如何? Jun 06, 2024 pm 12:41 PM

PHP框架的學習曲線取決於語言熟練度、框架複雜性、文件品質和社群支援。與Python框架相比,PHP框架的學習曲線較高,而與Ruby框架相比,則較低。與Java框架相比,PHP框架的學習曲線中等,但入門時間較短。

PHP 框架的輕量級選項如何影響應用程式效能? PHP 框架的輕量級選項如何影響應用程式效能? Jun 06, 2024 am 10:53 AM

輕量級PHP框架透過小體積和低資源消耗提升應用程式效能。其特點包括:體積小,啟動快,記憶體佔用低提升響應速度和吞吐量,降低資源消耗實戰案例:SlimFramework創建RESTAPI,僅500KB,高響應性、高吞吐量

Java框架的效能比較 Java框架的效能比較 Jun 04, 2024 pm 03:56 PM

根據基準測試,對於小型、高效能應用程序,Quarkus(快速啟動、低記憶體)或Micronaut(TechEmpower優異)是理想選擇。 SpringBoot適用於大型、全端應用程序,但啟動時間和記憶體佔用稍慢。

golang框架文件最佳實踐 golang框架文件最佳實踐 Jun 04, 2024 pm 05:00 PM

編寫清晰全面的文件對於Golang框架至關重要。最佳實踐包括:遵循既定文件風格,例如Google的Go程式設計風格指南。使用清晰的組織結構,包括標題、子標題和列表,並提供導覽。提供全面且準確的信息,包括入門指南、API參考和概念。使用程式碼範例說明概念和使用方法。保持文件更新,追蹤變更並記錄新功能。提供支援和社群資源,例如GitHub問題和論壇。建立實際案例,如API文件。

如何為不同的應用場景選擇最佳的golang框架 如何為不同的應用場景選擇最佳的golang框架 Jun 05, 2024 pm 04:05 PM

根據應用場景選擇最佳Go框架:考慮應用類型、語言特性、效能需求、生態系統。常見Go框架:Gin(Web應用)、Echo(Web服務)、Fiber(高吞吐量)、gorm(ORM)、fasthttp(速度)。實戰案例:建構RESTAPI(Fiber),與資料庫互動(gorm)。選擇框架:效能關鍵選fasthttp,靈活Web應用選Gin/Echo,資料庫互動選gorm。

Java框架學習路線圖:不同領域中的最佳實踐 Java框架學習路線圖:不同領域中的最佳實踐 Jun 05, 2024 pm 08:53 PM

針對不同領域的Java框架學習路線圖:Web開發:SpringBoot和PlayFramework。持久層:Hibernate和JPA。服務端響應式程式設計:ReactorCore和SpringWebFlux。即時計算:ApacheStorm和ApacheSpark。雲端運算:AWSSDKforJava和GoogleCloudJava。

Golang框架學習過程中常見的迷思有哪些? Golang框架學習過程中常見的迷思有哪些? Jun 05, 2024 pm 09:59 PM

Go框架學習的迷思有以下5種:過度依賴框架,限制彈性。不遵循框架約定,程式碼難以維護。使用過時庫,帶來安全和相容性問題。過度使用包,混淆程式碼結構。忽視錯誤處理,導致意外行為和崩潰。

See all articles