學習筆記 - 數據綁定之knockout

来源:http://www.cnblogs.com/gibbonnet/archive/2016/02/24/learningknockout.html
-Advertisement-
Play Games

參考: http://www.cnblogs.com/TomXu/archive/2011/11/21/2257154.html http://knockoutjs.com/documentation/introduction.html 複習:AngularJS的數據綁定 顯示文本 <p>{{gre


參考:

http://www.cnblogs.com/TomXu/archive/2011/11/21/2257154.html

http://knockoutjs.com/documentation/introduction.html

複習:AngularJS的數據綁定

顯示文本

<p>{{greeting}}</p>

或者

<p ng-bind=”greeting”></p>

 

表單輸入

<form ng-controller=”SomeController”>

         <input type=”checkbox” ng-model=”youCheckedIt”>

</form>

 

列表

<ul ng-controller=’StudentController’>

         <li ng-repeat=’student in students’>

                   <a href=’/student/view/{{student.id}}’>{{student.name}}</a>

         </li>

</ul>

 

表格

<table ng-controller=’AlbumController’>

         <tr ng-repeat=’track in album’>

                   <td>{{$index+1}}</td>

                   <td>{{track.name}}</td>

                   <td>{{track.duration}}</td>

         </tr>

</table>

 

使用$watch監控數據模型的變化

 

Knockout基礎學習

示例代碼出現錯誤,提示jquery-tmpl版本太舊,解決辦法

http://blog.degree.no/2012/09/microsoft-jscript-error-jquery-tmpl-is-too-old/

庫的線上引用地址

<script type="text/javascript" src="http://code.jquery.com/jquery-latest.js"></script>

<script type="text/javascript" src="./jquery.tmpl.js"></script>

<script type="text/javascript" src="http://knockoutjs.com/downloads/knockout-latest.js"></script>

 

Jquery.tmpl.js下載自

https://raw.githubusercontent.com/BorisMoore/jquery-tmpl/master/jquery.tmpl.js

https://github.com/BorisMoore/jquery-tmpl

 

入門

重要概念:

         聲明式綁定

         UI界面自動刷新

         依賴跟蹤

         模板

基本使用

         啟用綁定

         ko.applyBindings(viewModel)

         數據模型

         var viewModel = {

                   chosenMeal: ko.observable(availableMeals[0])

         }

         數據

         var availableMeals = [

             { mealName: 'Standard', description: 'Dry crusts of bread', extraCost: 0 },

               { mealName: 'Premium', description: 'Fresh bread with cheese', extraCost: 9.95 },

             { mealName: 'Deluxe', description: 'Caviar and vintage Dr Pepper', extraCost: 18.50 }

       ];            

         使用綁定,寫變數

         Chosen meal: <select data-bind="options: availableMeals,

                                optionsText: 'mealName',

                                value: chosenMeal"></select>

         使用綁定,讀變數,並作為參數提供給函數

<p>

    You've chosen:

    <b data-bind="text: chosenMeal().description"></b>

    (price: <span data-bind='text: formatPrice(chosenMeal().extraCost)'></span>)

</p>

         格式化函數

function formatPrice(price) {

    return price == 0 ? "Free" : "$" + price.toFixed(2);

}

Observables 可觀察變數

概念

observables, Dependent Observables, Observable Array

核心功能

         observables 可觀察變數 Dependency tracking 依賴跟蹤

         declarative bindings 顯式綁定

         templating 模板

View-Model

         視圖模型

激活Knockout

         ko.applyBindings(myViewModel, document.getElementById('someElementId'))

可觀察變數,聲明

var myViewModel = {

    personName: ko.observable('Bob'),

    personAge: ko.observable(123)

};

可觀察變數,讀寫

         讀:myViewModel.personAge()

         寫:myViewModel.personName('Mary'),支持鏈式語法

         綁定,data-bind,註冊到可觀察變數

可觀察變數,顯示訂閱

var subscription = myViewModel.personName.subscribe(function (newValue) { /* do stuff */ });

// ...then later...

subscription.dispose(); // I no longer want notifications

 

依賴可觀察變數

         var viewModel = {

             firstName: ko.observable('Bob'),

             lastName: ko.observable('Smith')

};

viewModel.fullName = ko.dependentObservable(function () {

    return this.firstName() + " " + this.lastName();

}, viewModel);

 

從依賴變數寫入可觀察變數

viewModel.fullName = ko.dependentObservable({

 

    read: function () {

        return this.firstName() + " " + this.lastName();

    },

 

    write: function (value) {

        var lastSpacePos = value.lastIndexOf(" ");

        if (lastSpacePos > 0) { // Ignore values with no space character

            this.firstName(value.substring(0, lastSpacePos)); // Update "firstName"

            this.lastName(value.substring(lastSpacePos + 1)); // Update "lastName"

        }

    },

    owner: viewModel

});

 

 

使用依賴變數數組observable array

var myObservableArray = ko.observableArray();    // Initially an empty array

myObservableArray.push('Some value');          // Adds the value and notifies observers

 

// This observable array initially contains three objects

var anotherObservableArray = ko.observableArray([

    { name: "Bungle", type: "Bear" },

    { name: "George", type: "Hippo" },

    { name: "Zippy", type: "Unknown" }

]);

 

js等價讀取信息:length, indexOf, slice

js數組等價操作:pop, push, shift, unshift, reverse, sort, splice

特殊操作:remove, removeAll

綁定語法一

         visible: 綁定到DOM元素,控制元素是否顯示

         text: 控制元素的文本值

         html: 控制元素顯示的HTML值

         css: 添加或刪除一個或多個CSS class到DOM元素上

         style: 添加或刪除一個或多個DOM元素上的style值

         attr: 提供了一種方式可以設置DOM元素的任何屬性值

綁定語法二

         click

         event, 例如keypress, mouseover, mouseout

         submit

         enable

         disable

綁定語法三

         value, <input>, <select>, <textarea>

         checked, <input type=’checkbox’>, <input type=’radio’>

         options, <select>, <select size=’6’>

         selectedOptions, multi-select

         uniqueName

 

模板綁定

         jquery.tmpl

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

    ${ someValue } — 參考文檔

    {{html someValue}} — 參考文檔

    {{if someCondition}} — 參考文檔

    {{else someCondition}} — 參考文檔

{{each someArray}} — 參考文檔

 

創建自定義綁定

ko.bindingHandlers.yourBindingName = {

    init: function(element, valueAccessor, allBindingsAccessor, viewModel) {

        // This will be called when the binding is first applied to an element

        // Set up any initial state, event handlers, etc. here

    },

 

    update: function(element, valueAccessor, allBindingsAccessor, viewModel) {

        // This will be called once when the binding is first applied to an element,

        // and again whenever the associated observable changes value.

        // Update the DOM element based on the supplied values here.

    }

};

 

載入或保存JSON數據

載入或保存數據:例如使用jQuery的$.getJSON, $.post, $.ajax

轉化ViewModel數據到JSON格式,有時需要json2.js類庫

         ko.toJS 轉化為JS對象

         ko.toJSON 轉化為JSON字元串

使用JSON更新ViewModel數據

         手動方式

 

或者使用 knockout.mapping

使用Mapping插件

         var viewModel = ko.mapping.fromJS(data); //創建ViewModel

         ko.mapping.fromJS(data, viewModel); //更新ViewModel

用法:

         key, create, update, ignore, include, copy

兩種方式創建viewModel

 

 

應用舉例

常用的控制項

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 1 $.ajax({ 2 type: "GET", 3 url: "handleAjaxRequest.action", 4 data: {paramKey:paramValue}, 5 async: true, 6 dataType:"json", 7 success: function(retu
  • 最近一直在惡補基礎JS H5 CSS3的基礎知識 關於這個瀑布流: 本來打算看著教程來做的。 不過 感覺理解起來有點複雜。 SO, 自己參考教程默寫了一個。。 目前我所接觸過的瀑布流佈局分為2大類 主要區分在於 float佈局 或者position佈局 點擊這裡下載Demo 貼下源碼:(可能有些BU
  • 基礎數據結構與演算法 現在有兩個不同的JSON,比較複雜,可以參考這裡的DEMO中返回的JSON。要比較它們的差異,除了用現成的工具如beyond compare以外,如果我們的機器上沒有安裝這個工具,能如何較快解決?作為一個程式員,一個個對比是不可行的,對比完也不會有什麼收穫。我會把之放進Excel
  • 21世紀,瀏覽器雜七雜八,足以讓你眼花繚亂。我們在做頁面相容性測試的時候,面對眾多的瀏覽器該如何調試我們的web頁面?其實,如果你瞭解了瀏覽器的內核,那麼就不會覺得頭疼。因為它們的內核並不是和他的數量一樣那麼多,常見的幾類內核可以歸為:Trident、Gecko、WebKit、Presto 四種。
  • 效果展示: html: <div class="sidebar"> <ul> <li>優先順序 <ul> <li><aonclick=""class="sidebar-selected">全部</a></li> <li><aonclick="">P1</a></li> <li><aonclick=""
  • underscore.js解析
  • 其實函數引用的外部變數都是最後一次的值。 <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Document</title> <style> #box{ width:100px; height:100px; b
  • AngularJS通過新的屬性與表達式來擴展HTML,有一種很形象的叫法,定義它為聲明式語言。 為剋服HTML在構建應用上的不足而設計! 這是它的目標。 它的官網進不去,應該是被牆了,這是goegle的團隊弄的。所以找了個應用AngularJS的網站,然後另存為下來的。 以一段簡單的代碼開頭 <di
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...