天天看點

KnockoutJS-模闆綁定

  對于knockoutJS來講,模闆綁定和Mapping插件綁定是十分重要的功能,雖然模闆綁定在我工作中用的及其少,但模闆綁定的重要性不可忽視,在其他前端架構中,如Angular、Vue等等,模闆存在的意義十分重要,Mapping插件使得我們能夠脫離手工綁定,及其友善我們快速綁定達到預期效果。

  KnockoutJS模闆綁定更多用法:https://knockoutjs.com/documentation/template-binding.html

  在mvc的開發中,對于常用的一些獨立的Html,習慣将它變成分布視圖或是視圖元件,以此來友善調用以及重用,同時也達到解耦效果,同樣在前端開發中,對于部分重用度很高、複雜度高的UI、嵌套UI等這些部分,我們也可以設計成模闆。

  

KnockoutJS-模闆綁定

  在knockoutJS中通過template綁定将模闆綁定到預期DOM元素中,将模闆所依賴的資料呈現。模闆綁定對于建構嵌套結構的頁面十分友善,預設情況, Knockout使用jquery.tmpl模闆引擎,使用模闆綁定時,需引用jquery.tmpl和jQuery架構,或者你也可以內建其它的模闆引擎(需要了解Knockout 内部知識)。

  模闆文法:

${ someValue } 

{{html someValue}}

{{if someCondition}}

{{else someCondition}}

{{each someArray}}

  具體了解模闆文法可以檢視:http://www.php.cn/js-tutorial-383558.html

   如果你僅僅是聲明的字元串,KO将會使用它作為模闆的ID去渲染。應用在模闆上的資料是你目前的viewModel對象。

  1、建構一個簡單模闆

  通過設計一個簡單的模闆,在viewModel中的name或age發生改變後,Knockout将自動重新render模闆。在該例子裡,每次點選按鈕都會重新渲染該模闆。

  2、建構一個性能更好點的簡單模闆

  通過data-bind的形式将屬性綁定時,如果屬性改變了,将直接改變值,而無需重新渲染模闆,這比通過${property}方式更加高效點,但是如果說模闆内容較小較簡單,直接使用${property}這種方式也是可行的,浪費點性能,寫起來快捷友善。

  3、嵌套模闆

  效果:

KnockoutJS-模闆綁定

  嵌套模闆是在一個模闆的基礎上,在模闆中繼續使用data-bind的形式利用template嵌套其他模闆,模闆的重新渲染以就近原則為主,最近的模闆資料改變,隻渲染最近的模闆,對于所有的模闆不進行重新渲染。

  4、foreach模闆

  在模闆中使用foreach完成相應的循環顯示時,有兩種方式,一種使用模闆文法{{each personArray}}這種形式 ,但是這種在性能上不如直接使用data-bind的方式,是以我将直接使用data-bind完成foreach模闆綁定,

KnockoutJS-模闆綁定

  對于複雜的模闆來講,需要循環使用如跟帖回帖操作,隻有内容不同、時間不同等等,其他html元素是一樣的,則使用這種方式能大幅提高開發效率。當增加一個Item到fo'reach關聯的數組集合中時,隻會将Item部分進行模闆的重新渲染,其餘已有的部分不影響,

當删除Item項時,模闆不執行渲染,隻是将Item從集合中移除。

  5、table模闆

  對于table模闆的實際用法與foreach模闆是一樣的,在foreach模闆中也同樣可以看見table模闆的效果展示。

  data-bind下template的綁定參數有

            name(必選項) — 需要render的模闆ID,可以通過對綁定屬性中值的動态變換,切換不同的模闆使用。

            data(可選項) — 需要render到模闆的資料。如果你忽略整個參數,KO将查找foreach參數,或者是應用整個view model對象。

            foreach(可選項)— 指定KO按照“foreach”模式render模闆 

            afterAdd或beforeRemove(可選項) — 在foreach模式下使用callback函數。

            templateOptions(可選項) — 在渲染模闆時可傳遞額外資料以便使用,可幫助你使用一些不屬于viewModel過濾條件或者字元來重用模闆。

  當然還有其他模闆引擎可以使用,但是就目前來講,個人感覺jquery.tmpl引擎已經滿足我的需求了。

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