精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

Knockout應用開發指南之模板綁定

開發 前端
template綁定通過模板將數據render到頁面。模板綁定對于構建嵌套結構的頁面非常方便。默認情況, Knockout用的是流行的jquery.tmpl模板引擎。使用它的話,需要在安裝頁面下載和引用jquery.tmpl和jQuery框架。或者你也可以集成其它的模板引擎(雖然需要了解Knockout 內部知識才行)。

目的

template綁定通過模板將數據render到頁面。模板綁定對于構建嵌套結構的頁面非常方便。默認情況, Knockout用的是流行的jquery.tmpl模板引擎。使用它的話,需要在安裝頁面下載和引用jquery.tmpl和jQuery框架。或者你也可以集成其它的模板引擎(雖然需要了解Knockout 內部知識才行)。

例子

  1. <div data-bind='template: "personTemplate"'> </div> 
  2. <script id='personTemplate' type='text/html'> 
  3.     ${ name } is ${ age } years old  
  4.     <button data-bind='click: makeOlder'>Make older</button> 
  5. </script>   
  6.  
  7. <script type='text/javascript'> 
  8.     var viewModel = {  
  9.         name: ko.observable('Bert'),  
  10.         age: ko.observable(78),  
  11.         makeOlder: function () {  
  12.             this.age(this.age() +1);  
  13.         }  
  14.     };  
  15.     ko.applyBindings(viewModel);  
  16. </script> 

當引用的observable(dependent observable)數據改變的時候,Knockout會自動重新render模板。在這個例子里,每次點擊button的時候都會重新render模板。

語法

你可以使用任何你模板引擎支持的語法。jquery.tmpl執行如下語法:

◆ ${ someValue } — 參考文檔

◆ {{html someValue}} — 參考文檔

◆ {{if someCondition}} — 參考文檔

◆ {{else someCondition}} — 參考文檔

◆ {{each someArray}} — 參考文檔

和observable數組一起使用{{each}}

當然使用{{each someArray}}的時候,如果你的值是observableArray,你必須使用JavaScript類型的基礎數組類型{{each myObservableArray()}},而不是{{each myObservableArray}}。

參數

主參數

語法快速記憶:如果你聲明的僅僅是字符串(上個例子),KO會使用模板的ID來render。應用在模板上的數據是你的整個view model對象(例如ko.applyBindings 綁定的對象)。

更多控件,你可以傳帶有如下屬性的JavaScript對象:

name(必選項) — 需要render的模板ID – 參考 注5 如何使用function函數聲明ID。

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

foreach(可選項) — 指定KO按照“foreach”模式render模板 – 參考 注3。

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

templateOptions(可選項) — 在render模板的時候,傳遞額外數據以便使用。參考 注6。

傳遞多個參數的例子:

  1. <div data-bind='template: { name: "personTemplate", data: someObject }'> </div> 

注1:Render嵌套模板

因為在模板里使用的是data-bind屬性來聲明的,所以嵌套模板你可以再次使用data-bind='template: ...',在上層模板的元素里。

這比模板引起的原生語法好用多了(例如jquery.tmpl里的{{tmpl}})。Knockout語法的好處在于可以在每層模板的跟著相關的依賴值,所以如果依賴改變了,KO將只會重新render依賴所在的那個模板。這將很大地改善了性能。

注2:${ val }和<span data-bind='text: val'></span>有何不同?

當你在模板內部使用data-bind屬性的時候,KO是單獨為這個綁定單獨跟蹤依賴項的。當model改變的時候,KO只會更新綁定的元素以及子元素而不需要重新render整個模板。所以如果你聲明這樣的代碼是<span data-bind='text: someObservableValue'></span>,當 someObservableValue改變的時候,KO將只是簡單地更新<span>元素的text值而不需要重新render整個模板。

不過,如果模板內部使用的observable值(例如${ someObservableValue }),如果這個observable值改變了,那KO將重新render整個模板。

這就是說,很多情況下<span data-bind='text: someObservableValue'></span>性能要比${ someObservableValue }要好,因為值改變的話不會影響臨近元素的狀態。不過${ someObservableValue }語法比較簡潔,如果你的模板比較小的話,還是更合適的,不會帶來大的性能問題。

注3:使用foreach

如果需要為集合里的每一個item render一次模板,有2種方式:

你可以使用模板引擎里的原生“each”語法,對jquery.tmpl來說就是用{{each}}語法迭代數組。

另外一種方式就是用Knockout的foreach模式來render。

 

例子:

  1. <div data-bind='template: { name: "personTemplate",  
  2.                             foreach: someObservableArrayOfPeople }'> </div> 

foreach模板模式的好處是:

◆ 當往你的collection集合里添加新item項的時候,KO只會對這個新item進行render模板,并且將結果附加到現有的DOM上。

◆ 當從collection集合里刪除item的時候,KO將不會重新render任何模板,而只是簡單地刪除相關的元素。

◆ KO允許通過自定義的方式聲明afterAdd和beforeRemove的callback函數添加/刪除DOM元素。然后這個callback會在刪除元素的時候進行一些動畫或者其它操作。

與原生的each不同之處是:在改變之后,模板引擎強制重新render模板里所有的內容,因為它根本就不關注KO里所謂的依賴跟蹤內容。

關于使用foreach模式的例子,參考grid editor和animated transitions。

 

注4:使用afterRender選項

有時候,你需要在模板生成的DOM元素上深度定義邏輯。例如,你可能想再模板輸出的時候進行截獲,然后在render的元素上允許jQuery UI命令(比如date picker,slider,或其它)。

你可以使用afterRender選項,簡單聲明一個function函數(匿名函數或者view model里的函數),在render或者重新render模板之后Knockout會重新調用它。如果你使用的是foreach,那在每個item添加到observable數組之后, Knockout會立即調用afterRender的callback函數。例如,

  1. <div data-bind='template: { name: "personTemplate",  
  2.                             data: myData,  
  3.                             afterRender: myPostProcessingLogic }'> </div> 

… 在view model里聲明一個類似的函數(例如,對象包含myData):

  1. viewModel.myPostProcessingLogic = function (elements) {  
  2.     // "elements" is an array of DOM nodes just rendered by the template  
  3.     // You can add custom post-processing logic here  

注5:動態決定使用哪個模板

有時候,你可能需要根據數據的狀態來決定使用哪個模板的ID。可以通過function的返回ID應用到name選擇上。如果你用的是foreach模板模式, Knockout會對每個item執行function(將item作為參數)從而將返回值作為ID,否則,該function接受的參數是整個 data option或者是整個view model。

 

例子:

  1. <ul data-bind='template: { name: displayMode,  
  2.                            foreach: employees }'> </ul>   
  3. <script type='text/javascript'> 
  4. var viewModel = {  
  5.     employees: ko.observableArray([  
  6.         { name: "Kari", active: ko.observable(true) },  
  7.         { name: "Brynn", active: ko.observable(false) },  
  8.         { name: "Nora", active: ko.observable(false) }  
  9.     ]),  
  10.     displayMode: function (employee) {  
  11.         return employee.active() ?"active" : "inactive";  
  12.         // Initially "Kari" uses the "active" template, while the others use "inactive"  
  13.     }  
  14. };  
  15.  
  16. // ... then later ...  
  17. viewModel.employees()[1].active(true);  
  18. // Now "Brynn" is also rendered using the "active" template.  
  19. </script> 

如果你的function引用的是observable值,那當這些值改變的時候,綁定的值會隨著改變的。這將導致相應的模板重新render。

 

注6:使用templateOptions傳遞額外的參數

如果你在綁定模板的時候需要傳入額外的數據的話,你可以使用templateOptions對象來傳遞這些值。這可以幫助你通過一些 不屬于view model過濾條件或者字符來重用模板。另外一個好處是用在范圍控制,你可以引用通過你的模板訪問怒道的數據。

 

例子,

  1. <ul data-bind='template: { name: "personTemplate",  
  2.                            foreach: employees,  
  3.                            templateOptions: { label: "Employee:",  
  4.                                               selectedPerson: selectedEmployee } }'> </ul> 
  5.  
  6.  
  7. <script id='personTemplate' type='text/html'> 
  8.     <div data-bind="css: { selected: $data === $item.selectedPerson()" }"> 
  9.         ${ $item.label } <input data-bind="value: name" /> 
  10.     </div> 
  11. </script> 

在整個例子里,personTemplate有可能都使用employee和自定義對象。通過templateOptions我們可以傳遞一個字符label和當前已選擇項作為selectedPerson來控制style。在jquery.tmpl模板里,這些值可以通過訪問$item對象的屬性得到。

 

注7:模板是被預編譯和緩存的

為了***性能,Knockout內嵌模板引擎jquery.tmpl會利用自身的功能對你的模板進行預編譯成可執行的JavaScript代碼,然后從編譯流程里緩存輸出。這將使模板更快更加具有可執行性,尤其是是使用foreach循環來render相同模板的時候。

一般情況你不會注意到這個,所以經常會忘記。不過,當你在某種原因下通過編程重寫模板<script>元素的時候并且該模板之前已經用過一次的話,你的改變不會帶來任何render的變化,因為在***次使用的時候已經預編譯了并且緩存起來了。(如果這些會帶來問題,我們將考慮在KO新版本里提供一個禁用或重設模板緩存的功能,不過好像沒有好的原因去動態改變模板<script>元素的內容)。

 

注8:使用不同的模板引擎

如果你想使用不同的JavaScript模板引擎(或者是因為某些原因你不想在jQuery上使用依賴)。我們可以去為KO來寫一個不同的模板引擎,例如,在KO源代碼里的jqueryTmplTemplateEngine.js,盡管他是為了支持多個版本的jquery.tmpl而編譯。支持一個單獨的模板引擎版本相對簡單多了。

 

依賴性

template綁定只能在引用合適的模板引擎情況下才能工作。例如提到的jquery.tmpl引擎。

【系列文章】

  1. Knockout應用開發指南之綁定語法
  2. Knockout應用開發指南之監控屬性(Observables)
  3. Knockout應用開發指南之入門介紹
責任編輯:陳貽新 來源: 湯姆大叔的博客
相關推薦

2011-11-30 16:29:41

2011-12-05 15:02:21

Knockout

2011-11-29 16:38:58

Knockout

2011-12-05 15:44:45

Knockout

2012-01-04 16:21:11

2011-11-29 16:56:30

Knockout

2012-01-04 16:11:49

Knockout

2014-05-16 11:09:38

Handlebars模板引擎

2011-04-15 14:22:20

圖片操作UIBlackBerry

2011-04-18 11:00:34

使用音頻BlackBerry

2011-06-07 09:10:41

BlackBerry 開發

2011-04-15 15:16:28

使用圖像對象畫圖BlackBerry

2011-07-25 16:21:22

Sencha touc

2022-08-02 08:01:09

開發插件Chrome前端技術

2011-04-15 16:05:00

監聽UI對象的改變BlackBerry

2012-03-26 09:27:40

谷歌安卓開發谷歌安卓

2011-06-09 18:24:36

QT Wince

2023-05-15 18:44:07

前端開發

2009-06-24 16:30:21

JSF組件模型

2013-10-09 09:10:28

移動應用開發NativeHybrid
點贊
收藏

51CTO技術棧公眾號

成人av免费| 中文字幕在线观看精品| 久久精品色综合| 色哟哟日韩精品| 亚洲三区在线观看| 国产刺激高潮av| 日韩高清在线一区| 色综合久综合久久综合久鬼88| 中文字幕 日本| 狠狠久久综合| 欧美日韩另类在线| 日本不卡一区二区三区四区| 少妇av一区二区| 久久草av在线| 欧美在线中文字幕| 久草福利资源在线观看| 国产99久久精品一区二区300| 91精品国产一区二区三区香蕉 | www.四虎精品| 精品视频在线一区二区在线| 亚洲成人福利片| 亚洲综合av一区| 黄色av网站在线免费观看| 国产成人精品免费一区二区| 国产精品久久久久久久天堂| 日本在线视频中文字幕| 久久久久久久久久久久久久| 亚洲视频综合网| 国产激情视频网站| 一区二区三区在线免费看| 欧美喷潮久久久xxxxx| 日韩毛片在线免费看| 91黄页在线观看| 夜夜嗨av一区二区三区四季av | 在线一区二区三区做爰视频网站| 欧美乱做爰xxxⅹ久久久| √新版天堂资源在线资源| 久久色在线观看| 精品欧美日韩在线| 欧美自拍偷拍第一页| 国产乱码精品一区二区三区五月婷| 国产成人精品在线播放| 国产乱国产乱老熟| 亚洲毛片一区| 97久久久久久| 久久精品国产亚洲av香蕉| 欧美激情第8页| 久久综合久久美利坚合众国| 一本一本久久a久久| 人人狠狠综合久久亚洲婷| 国产亚洲美女精品久久久| 波多野结衣 在线| 伊人春色精品| 亚洲午夜未删减在线观看 | 91chinesevideo永久地址| 精品少妇久久久| 亚洲激情网站| 2018国产精品视频| 日韩色图在线观看| 久久久久91| 国产精品久久久久久亚洲影视| 无码人妻久久一区二区三区不卡| 久久久久久黄| 国产精品人成电影| 国产精品高潮呻吟AV无码| 久久91精品国产91久久小草 | 18岁视频在线观看| 深夜视频一区二区| 欧美日韩情趣电影| 日本55丰满熟妇厨房伦| 88久久精品| 亚洲精品在线视频| 91精品久久久久久久久久久久| 精品视频网站| 久久在线免费视频| 日韩黄色a级片| 日本成人中文字幕| 91在线播放国产| 男人天堂综合网| 久久精品欧美日韩精品 | 免费高清在线观看| 一区二区三区四区蜜桃| 北条麻妃在线视频观看| 欧美性片在线观看| 欧美一级二级三级蜜桃| 完美搭档在线观看| 成人午夜av| 色综合久久悠悠| 人妻丰满熟妇av无码区| 精品亚洲成a人| 国产亚洲情侣一区二区无| 青青草视频免费在线观看| 亚洲国产成人在线| 国产成人亚洲综合无码| gogo亚洲高清大胆美女人体| 91精品国模一区二区三区| 老司机午夜免费福利| 日韩欧美1区| 久久久久久久久久久久av| 最新中文字幕免费| 成人丝袜18视频在线观看| 日产精品一线二线三线芒果| 午夜在线激情影院| 欧洲精品视频在线观看| 亚洲一级Av无码毛片久久精品| 国产一区网站| 欧美极品第一页| 一级黄色小视频| 久久综合九色综合久久久精品综合| 亚洲午夜精品一区二区三区| av资源中文在线| 欧美日韩高清一区二区三区| 亚洲精品乱码久久久久久不卡| 久久国产精品亚洲人一区二区三区 | 欧美日韩一区不卡| 一出一进一爽一粗一大视频| 狠狠操综合网| 97久久精品国产| www.com欧美| 中文字幕视频一区| 中文字幕一区二区三区四区在线视频| 少妇高潮一区二区三区99| 欧美一区二区三区的| 最新中文字幕av| 欧美亚洲在线| 精品国产一区二区三区麻豆小说 | 久久人人爽人人| www.精品久久| 亚洲激情综合网| 久久国产这里只有精品| 国产欧美日韩| 国产成人精品免高潮费视频| 天天在线女人的天堂视频| 亚洲一区二区三区自拍| 韩国三级与黑人| 你懂的国产精品| 亚洲free性xxxx护士白浆| 在线观看国产原创自拍视频| 91成人网在线| 日本少妇xxxxx| 久久久久国产精品一区三寸| 欧美日韩成人一区二区三区| 美女高潮视频在线看| 亚洲国产第一页| 欧美一二三区视频| av色综合久久天堂av综合| 欧美日韩在线一| 欧美电影在线观看免费| 91av福利视频| 黄色片在线免费看| 欧美怡红院视频| jizz日本在线播放| 久久国产欧美日韩精品| 四虎影院一区二区| 日韩精品一级| 韩国美女主播一区| 日韩专区一区二区| 一本到高清视频免费精品| 黄免费在线观看| 免费看欧美女人艹b| 中文字幕一区二区三区精彩视频 | 小向美奈子av| 国产精品综合二区| 日本手机在线视频| 亚洲大片精品免费| 国产精品视频一| 国产精品va在线观看视色| 欧美xxx久久| 国产原创视频在线| 亚洲欧美在线aaa| 亚洲成年人在线观看| 国产精品乱看| 亚洲人一区二区| 视频免费一区二区| 4p变态网欧美系列| 五月香视频在线观看| 日韩欧美国产麻豆| 精品免费囯产一区二区三区| 欧美激情一区二区三区四区| 亚洲精品久久久久久| 99热精品在线| 一级日韩一区在线观看| 91成人精品在线| 国产精品久久久久91| a视频在线播放| 国产婷婷成人久久av免费高清| 中文字幕日日夜夜| 亚洲国产中文字幕在线视频综合| 久久中文字幕人妻| 国产一区二区美女诱惑| 成人免费在线小视频| 婷婷精品进入| 欧美精品一区三区在线观看| 欧美经典影片视频网站| 国产成人精品免费视频| 啦啦啦中文在线观看日本| 亚洲四色影视在线观看| 亚洲免费一级片| 欧美综合在线视频| 日韩精品视频免费看| 亚洲国产成人午夜在线一区| 亚洲成年人在线观看| 麻豆国产一区二区| 久久久久久久久久久视频| 久久久久亚洲| 日韩视频专区| 任你躁在线精品免费| 91精品久久久久久久久不口人| av资源在线看片| 久色乳综合思思在线视频| 国产一区电影| 日韩高清免费观看| 精品人妻一区二区三区浪潮在线| 欧美在线影院一区二区| av黄色在线播放| 亚洲国产精品久久人人爱蜜臀 | 噜噜噜噜噜在线视频| 欧美大肚乱孕交hd孕妇| 一卡二卡在线视频| 91黄色小视频| 一级片视频在线观看| 亚洲成av人影院| 久久网一区二区| 自拍偷拍国产亚洲| 激情无码人妻又粗又大| 欧美激情一区二区三区四区| av男人的天堂av| 久久久综合激的五月天| a天堂视频在线观看| 成人一区二区三区中文字幕| 久久久久亚洲av无码麻豆| 久久国产精品无码网站| 人人干人人干人人| 日韩av中文在线观看| 亚洲乱码国产一区三区| 免费亚洲视频| 99蜜桃臀久久久欧美精品网站| 1024日韩| 成熟了的熟妇毛茸茸| 99国产精品99久久久久久粉嫩| 国产在线播放观看| 在线看片一区| 黄页免费在线观看视频| 在线综合视频| 欧美性大战久久久久xxx| 久久福利毛片| 女人另类性混交zo| 日韩成人精品在线| 黄大色黄女片18第一次| 久久精品噜噜噜成人av农村| 亚洲免费黄色录像| 国产一区二区三区国产| 中文字幕乱码在线人视频| 国产99久久久国产精品| 午夜视频在线观看国产| 99re在线视频这里只有精品| 国产ts丝袜人妖系列视频| 久久久无码精品亚洲日韩按摩| av女人的天堂| 中文字幕在线一区免费| 在线免费观看亚洲视频| 一区二区在线电影| 日韩乱码在线观看| 色综合一区二区| 中文字幕一区二区人妻| 欧美精品久久99久久在免费线| 99久久精品无免国产免费| 日韩精品自拍偷拍| 日韩国产福利| 日韩有码在线观看| 欧洲一区二区三区| 日韩美女视频免费看| 欧美日韩视频免费看| 成人av资源| 怕怕欧美视频免费大全| 在线一区高清| 99亚洲一区二区| 色综合天天色综合| 成人综合婷婷国产精品久久蜜臀 | 亚洲欧美综合另类在线卡通| 欧美三级 欧美一级| 精品久久久久久久久久国产| 中文字幕男人天堂| 精品国产免费久久| 国产h在线观看| 久久久久久久久久久人体| 久久91导航| 99热国产免费| 国内精品伊人久久久| 91亚洲精品国产| 青草国产精品久久久久久| 91精品国产高清91久久久久久 | 国产一区视频导航| 播金莲一级淫片aaaaaaa| 亚洲欧洲在线观看av| 日韩精品1区2区| 777亚洲妇女| 牛牛影视精品影视| 久久99精品久久久久久琪琪 | 亚洲狼人精品一区二区三区| 在线观看国产中文字幕| 成人国产免费视频| 欧美视频一区二区在线| 福利一区福利二区微拍刺激| 国产日韩欧美视频在线观看| 亚洲男人天堂2024| 黄色成人在线网| 国产精品一区久久久| 婷婷五月色综合香五月| 一本大道东京热无码aⅴ| 免费看黄色91| av网站免费在线看| 婷婷成人激情在线网| 成 人片 黄 色 大 片| 日韩亚洲成人av在线| 韩国精品主播一区二区在线观看| 国产日韩久久| 欧美日韩亚洲一区二区三区在线| 在线看的黄色网址| 久久蜜桃av一区二区天堂| 久久综合久久鬼| 欧美一区二区三区在线电影| 国产69精品久久app免费版| 热99精品里视频精品| 国产精品17p| 欧美中日韩在线| 国产精品自拍在线| 欧美日韩中文字幕在线观看| 在线不卡一区二区| 日本在线观看免费| 国产精品青青在线观看爽香蕉| 国产欧美一区二区三区精品观看| 日韩av高清在线看片| 国产999精品久久久久久绿帽| 国产探花在线视频| 91 com成人网| 国产三区视频在线观看| 96pao国产成视频永久免费| 国产精品久久久久9999赢消| 天堂视频免费看| 国产精品免费aⅴ片在线观看| 国产精品高清无码| 在线视频中文亚洲| 欧美一级做a| 青草全福视在线| 国产精品综合视频| 国产精品19乱码一区二区三区| 欧美成人性战久久| 丁香花在线观看完整版电影| 国产伦一区二区三区色一情| 亚洲欧洲另类| 黄色性生活一级片| 欧美中文字幕一二三区视频| av在线免费播放网站| 国产精品一区久久久| 亚洲视频电影在线| 亚洲成年人av| 欧美小视频在线观看| 免费福利在线视频| 国产精品视频永久免费播放| 欧美疯狂party性派对| 91大神免费观看| 亚洲愉拍自拍另类高清精品| 三级在线观看网站| 日本中文字幕不卡免费| 91嫩草亚洲精品| 波多野结衣办公室双飞| 精品久久久久久中文字幕大豆网| 毛片网站在线观看| 国产在线精品播放| 好看不卡的中文字幕| 欧美 日本 国产| 欧美日韩高清一区二区不卡| 欧美性爽视频| 欧美一区三区二区在线观看| 激情五月激情综合网| 国产又色又爽又黄的| 中文字幕在线看视频国产欧美| 欧美黄视频在线观看| 中文字幕乱码人妻综合二区三区 | 一本一本久久a久久精品综合小说| 久久久久久一区二区三区四区别墅| 无码人妻精品一区二区三区99v| 不卡一区二区三区四区| 久草热在线观看| 久久久免费观看| 精品99久久| 国产性猛交96| 欧美性xxxxx极品少妇| 人交獸av完整版在线观看| 日韩精品国内| 国产99精品在线观看| 中文天堂在线资源| 97精品在线视频| 91精品动漫在线观看| 亚洲v国产v欧美v久久久久久| 精品久久久影院| 欧美成人毛片| 久久美女福利视频| 亚洲最色的网站|