天天看點

KnockoutJS-快速入門

  雖然在WPF中接觸過MVVM模式,可是剛開始在Web中接觸到Knockout.JS讓我大吃一驚,簡化了好多工作量,原來可能需要一大堆的JS腳本完成的工作量,被釋放許多。接觸KnockoutJS一年多了,在好多個項目中也用到過,雖然每個項目中都有點重複造輪子的滋味,但是不得不說,越來越喜歡用KO完成前端的一些工作,雖然現在有許多流行的MVVM/MVC前端架構,如Angular、Vue、React等等,接觸過Vue,簡單用過一次,接觸不深,不敢談論,也就帶過吧。工作之餘,開始總結自己在使用的工具、架構上用到的,體會到的感受。

  先來看個最簡單ko所帶來的效果:

  

KnockoutJS-快速入門

  看看代碼是如何簡潔設計的:

  knockout.JS利用的是MVVM模式,不依賴任何第三方的、純Javascript編寫的UI類庫。官網位址:http://knockoutjs.com/

KnockoutJS-快速入門

  Model-View-View Model (MVVM) 是一種建立使用者界面的設計模式。 描述的是如何将複雜的UI使用者界面分成3個部分:

Model:背景模型對象,存儲着資料和操作,獨立于前端UI的存在,與具體業務打交道。

ViewModel:前台資料展示,通常是用于對外互動的,ViewModel有兩種不同的使用場景,一種是背景對外的ViewModel用于對外互動時接收的對象屬于伺服器端ViewModel,一種是前台Javscript對象在前台的資料互動模型.如ko中的ViewModel,當然這兩種常常是互相轉換的。

View:視圖頁面,使用者能夠見到的互動頁面,存放着與ViewModel互動的UI,輸入資料或操作對象完成對ViewModel的更新,

  Knockout有着三大核心功能:

監控屬性(Observables)和依賴跟蹤(Dependency tracking)

聲明式綁定(Declarative bindings)

模闆(Templating)

  對于模闆,個人而言,用到的次數并不是很多,大多數時候前兩個功能就已經完全滿足業務需求了。

  1、以剛開始的最簡單的例子來看,寫的js代碼無非就是聲明了一個對象,然後将這個對象利用ko.applyBindings()綁定到了ko中,便可以利用viewModel對象完成ko的相關功能。

       ko.applyBindings()方法第一個參數用于綁定需要綁定的viewModel對象,第二個可選參數用來限定第一個參數的綁定範圍,這樣一來,頁面上可以聲明出很多個不同作用範圍的viewModel對象。

  2、viewModel對象内部,定義屬性或方法有許多種方式(我比較鐘意這種方式,有點鍵值對的感覺)。

    其中的ko.observable()方法還有兩個兄弟,ko.observableArray()和ko.computed(),個人而言前兩種用的較多。

    ko.observable()方法,将UI元素和viewModel中的屬性進行雙向關聯,一方的改變影響着另一方,如上的例子中,在js中需要對unitName操作時有:

讀資料操作:varunitName = viewModel.unitName(); 讀取到unitName的資料,通常是UI上輸入資料,js中需要根據輸入的資料做處理用它。

寫資料操作:viewModel.unitName("部落格園"); UI上相應綁定的元素将會使用新的值,通常是用于js取得新資料并綁定到UI上使用。

    ko.observableArray()方法,綁定集合或數組,通常以清單形式出現,對清單内的資料展示或增删操作。監控數組監控的是整個集合/數組對象,内部的具體對象的監控不屬于它的職責範圍。

    在js中如果某個業務需求需要增加或是删除某個對象,利用集合的push('新值')或是remove(‘舊值’)即可。

KnockoutJS-快速入門

    ko.computed()方法,針對多個屬性的同時監控,而産生的最終結果,可以監控多個屬性的變化然後傳回不同的資料,個人對這個方法來講,沒用過幾次,大多數時候如果需要監控多個屬性的變化,我還是喜歡另寫一個方法去改變最終結果。如下可以将unitInfo屬性綁定在UI元素上,但另外兩個屬性的值改變時後,這個值也會相應的改變。對于computed方法還有一個同樣的pureComputed方法,如果要用推薦使用pureComputed方法,該方法相比computed而言能夠更快的重新渲染和更低的記憶體使用。

    對于pureComputed方法,最優的使用還是利用它的重寫功能,我們通過write方法,可以實作許多功能,如拆分、提煉字元串等等,具體業務,具體設計。

    效果展示:

KnockoutJS-快速入門

  3、UI上用到的data-bind屬性

    data-bind屬性雖然好用但它不是HTML的原生屬性,嚴格遵從HTML5文法屬于'data-'系家族常用來做自定義屬性。ko中命名data-bind來作為資料綁定的屬性,所有的操作都依靠data-bind屬性完成。

   至此,基本上ko的操作就全部到這裡了,還有包括模闆等功能,雖然存在,但是實際來講我用到的地方,或許有很多博友用到了,需要看模闆的博友,可以參考其它博友的文章。

  雖然ko釋出到現在也有六七年了,有點廉頗老矣的感覺,比不上新興之秀們,但是ko的功能仍然是優秀的,也不存在非常落後的地方。

  ko具備的首要功能:

簡潔依賴追蹤:無論何時資料模型改動,UI将會自動更新。

聲明式綁定: 淺顯易懂的方式将UI中指定部分關聯到資料模型上,并能夠通過嵌套模闆建構複雜的動态UI。

輕易可擴充:通過幾行代碼就可以實作自定義行為作為新的聲明式綁定用于重用。

  另外的優勢:

純JavaScript類庫:相容任何伺服器端和用戶端技術

可添加到Web程式最上部:不需要大的架構改變

簡潔的: Gzip之後大約13kb

相容任何主流浏覽器 (IE 6+、Firefox 2+、Chrome、Safari、Edge、其它)

文檔詳細的綜合元件 (采用行為驅動開發) - 意味着在新的浏覽器和平台上可以很容易通過驗證。

 代碼位址:https://gitee.com/530521314/Partner.TreasureChest.git

 參考文章:@湯姆大叔 http://www.cnblogs.com/TomXu/archive/2011/11/21/2257154.html