<output id="qn6qe"></output>

    1. <output id="qn6qe"><tt id="qn6qe"></tt></output>
    2. <strike id="qn6qe"></strike>

      亚洲 日本 欧洲 欧美 视频,日韩中文字幕有码av,一本一道av中文字幕无码,国产线播放免费人成视频播放,人妻少妇偷人无码视频,日夜啪啪一区二区三区,国产尤物精品自在拍视频首页,久热这里只有精品12
      代碼改變世界

      Knockout應(yīng)用開發(fā)指南 第四章:模板綁定

      2011-11-25 09:01  湯姆大叔  閱讀(33317)  評論(28)    收藏  舉報

      模板綁定The template binding

      目的

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

       

      例子

      <div data-bind='template: "personTemplate"'> </div>
      <script id='personTemplate' type='text/html'>
      ${ name } is ${ age } years old
      <button data-bind='click: makeOlder'>Make older</button>
      </script>

      <script type='text/javascript'>
      var viewModel = {
      name: ko.observable(
      'Bert'),
      age: ko.observable(
      78),
      makeOlder:
      function () {
      this.age(this.age() +1);
      }
      };
      ko.applyBindings(viewModel);
      </script>

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

       

      語法

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

       

      和observable數(shù)組一起使用{{each}}

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

       

      參數(shù)

          主參數(shù)

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

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

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

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

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

                  afterAddbeforeRemove(可選項) — 在foreach模式下使用callback函數(shù)。

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

       

      傳遞多個參數(shù)的例子:

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


      注1:Render嵌套模板

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

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

       

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

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

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

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

       

      注3:使用foreach

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

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

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

       

      例子:

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


      foreach模板模式的好處是:

      • 當往你的collection集合里添加新item項的時候,KO只會對這個新item進行render模板,并且將結(jié)果附加到現(xiàn)有的DOM上。
      • 當從collection集合里刪除item的時候,KO將不會重新render任何模板,而只是簡單地刪除相關(guān)的元素。
      • KO允許通過自定義的方式聲明afterAdd和beforeRemove的callback函數(shù)添加/刪除DOM元素。然后這個callback會在刪除元素的時候進行一些動畫或者其它操作。

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

      關(guān)于使用foreach模式的例子,參考grid editor和animated transitions。

       

      注4:使用afterRender選項

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

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

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

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

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

       

      注5:動態(tài)決定使用哪個模板

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

       

      例子:

      <ul data-bind='template: { name: displayMode,
      foreach: employees }'
      > </ul>
      <script type='text/javascript'>
      var viewModel = {
      employees: ko.observableArray([
      { name:
      "Kari", active: ko.observable(true) },
      { name:
      "Brynn", active: ko.observable(false) },
      { name:
      "Nora", active: ko.observable(false) }
      ]),
      displayMode:
      function (employee) {
      return employee.active() ?"active" : "inactive";
      // Initially "Kari" uses the "active" template, while the others use "inactive"
      }
      };

      // ... then later ...
      viewModel.employees()[1].active(true);
      // Now "Brynn" is also rendered using the "active" template.
      </script>

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

       

      注6:使用templateOptions傳遞額外的參數(shù)

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

       

      例子,

      <ul data-bind='template: { name: "personTemplate",
      foreach: employees,
      templateOptions: { label: "Employee:",
      selectedPerson: selectedEmployee } }'
      > </ul>


      <script id='personTemplate' type='text/html'>
      <div data-bind="css: { selected: $data === $item.selectedPerson()" }">
      ${ $item.label } <input data-bind=
      "value: name" />
      </div>
      </script>

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

       

      注7:模板是被預(yù)編譯和緩存的

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

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

       

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

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

       

      依賴性

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

       

      點擊查看本系列教程目錄

      主站蜘蛛池模板: 国精品无码一区二区三区在线 | 亚洲综合无码久久精品综合| 国产精品高清一区二区不卡| 国产精品久久人妻无码网站一区 | 麻豆一区二区中文字幕| 免费无码一区无码东京热| 欧美偷窥清纯综合图区| 福利视频在线播放| 欧美国产日韩久久mv| 真实国产精品视频400部| 蜜臀精品视频一区二区三区| 精品国产免费一区二区三区香蕉| 精品无码国产日韩制服丝袜| 91中文字幕一区二区| 中文字幕亚洲男人的天堂| 亚洲高清日韩专区精品| 野外少妇被弄到喷水在线观看| 色综合久久中文综合久久激情| 成人精品国产一区二区网| 新版资源天堂中文| 三人成全免费观看电视剧高清| 欧美人人妻人人澡人人尤物| 久久天天躁狠狠躁夜夜婷 | 午夜免费福利小电影| 四虎成人高清永久免费看| 久久99久国产精品66| 丰满高跟丝袜老熟女久久| 国产真实乱对白精彩久久老熟妇女| 国产美女久久久亚洲综合| 亚洲二区中文字幕在线| 国产精品剧情亚洲二区| 久久精品女人的天堂av| 绥德县| 国产精品久久久久久福利69堂| 国产成人剧情AV麻豆果冻| 日韩人妻精品中文字幕专区| 久久99九九精品久久久久蜜桃| 日本狂喷奶水在线播放212| 国产综合有码无码中文字幕| 最新午夜男女福利片视频| 亚洲成人av在线系列|