首頁 web前端 js教程 Knockoutjs快速入門(經典)_基礎知識

Knockoutjs快速入門(經典)_基礎知識

May 16, 2016 pm 05:45 PM

Knockoutjs是一個JavaScript實作的MVVM框架。主要有以下幾個功能:

1. Declarative bindings

2. Observables and dependency tracking

3. Templating

它對於分離前台的業務邏輯和視圖簡化資料綁定過程有顯著的作用。閒言少敘,直接看例子,如何下載也不說了,如果用VS開發的話用Nuget就可以一鍵搞定。

1.基本綁定與依賴追蹤
首先需要定義一個ViewModel:

複製程式碼



複製程式碼



複製程式碼


複製程式碼複製程式碼
複製程式碼



複製程式碼


複製碼

程式碼如下:

然後是一個用來顯示這個ViewModel的View:

複製程式碼image

程式碼如下:


從這個view中可以看到宣告式綁定的意義,只需要在標籤上使用data-bind屬性,就可以將資料的值綁定到對應的地方。有了View和ViewModel也需要程式碼將這兩者關聯起來:



複製程式碼

程式碼如下:image

ko.applyBindings(new ViewModel());

將他們放到一起,注意,applyBinding那程式碼必須在頁面全部載入完之後執行。頁面顯示為: 下面再看observables,這個功能不是與生俱來的,必須要把View Model設定為observable,方法如下:



複製程式碼


程式碼如下:

function ViewModel() {

this.firstName = ko.observable("Zixin"); imagethis.lastName = ko.observable("Zixin");

this.lastName = ko.servobable(" Yin");

}

其他都不需要改變,這時候,如果改變輸入框中的值,當焦點離開的時候,可以發現p中的值也跟著改變了: 下面再看dependency tracking,也就是如果一個值依賴多各值,其中任何一個值發生變化,它都會自動發生變化. 這是透過computed方法實現的,代碼如下:



複製程式碼


程式碼如下:

function ViewModel() {
this.firstName = ko.obable("Zixix" );
this.lastName = ko.observable("Yin"); this.fullName = ko.computed(function () { return this.lastName() " " this.firstName(); },this ); } 注意得到一個observable的值是一個函式呼叫。這樣當first 或last name發生變更的時候fullName也會自動跟著變更。
也可以透過程式碼改變observable的值,頁面會自動刷新:複製程式碼 程式碼如下:function ViewModel() { //……… this.capitalizeLastName = function () { this.lastName(this.lastName().toUpperCase()); this.lastName(this.lastName().toUpperCase()); } } 在頁面上加上一個按鈕:複製程式碼複製程式碼複製程式碼 程式碼如下:> 程式碼如下:


點選按鈕之後便會出發viewmodel的capitalizeLastName方法,要改變一個observable的值的方法就是將新值作為函數呼叫的參數。點擊之後:

image 

2. 列表綁定

加入我們有如下的訂單ViewModel,使用observableArray來追蹤陣列的變化。

複製程式碼 程式碼如下:

var products=[{name:"Think X1", price:9000},
{name:"Hp ProBook",price:5555},
{name:"Mouse",price:45} ];

function Order() {
var self = this;
self.items = ko.observableArray([
//This data should load from server
new Item(products[0], 1),
new Item(products [1],2)]);
self.price = ko.computed(function () {
var p=0;
for (var i = 0; i var item = self.items()[i];
p = item.product.price * item.amount();
}
return p;
}, self);
}

Order裡面的Item其實應該是從伺服器取得的,Item定義如下:
複製程式碼 程式碼如下:

function Item(product, amount) {
var self = this;
this.product = product; >this.amount = ko.observable(amount);
this.subTotal = ko.computed(function () {
return self.amount() * self.product.price;
}, self) ;
}

ViewModel準備好之後,就可以實作View。這次需要使用foreach綁定,如下:

複製程式碼 程式碼如下:














Name Amount Price
td>

Order Price:



這樣一個基本的訂單頁面就好了,能夠選擇數量,價格會自動更新:

image

下面為訂單加上增刪產品的功能,先給Order加上如下的方法:


複製程式碼 代碼如下:
function Order() {
//……
self.remove = function (item) {
self.items.remove(item);
}

self.addMouse = function () {
self.items.push(new Item(products[2],1));
}
}

}
}
}}

加上一列刪除按鈕


複製程式碼複製程式碼
程式碼>
Remove
再在表格底部加上一個增加產品的按鈕:複製程式碼 程式碼如下:
這時候,observableArray的功能就體現了,當你點擊刪除按鈕或底部的按鈕的時候,頁面節點會跟著變化,而不需要手動更新DOM節點,這使得前端的JS大大簡化。

image

本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

AI Hentai Generator

AI Hentai Generator

免費產生 AI 無盡。

熱門文章

R.E.P.O.能量晶體解釋及其做什麼(黃色晶體)
3 週前 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.最佳圖形設置
3 週前 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.如果您聽不到任何人,如何修復音頻
3 週前 By 尊渡假赌尊渡假赌尊渡假赌
WWE 2K25:如何解鎖Myrise中的所有內容
4 週前 By 尊渡假赌尊渡假赌尊渡假赌

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

SublimeText3 Mac版

SublimeText3 Mac版

神級程式碼編輯軟體(SublimeText3)

如何創建和發布自己的JavaScript庫? 如何創建和發布自己的JavaScript庫? Mar 18, 2025 pm 03:12 PM

文章討論了創建,發布和維護JavaScript庫,專注於計劃,開發,測試,文檔和促銷策略。

如何在瀏覽器中優化JavaScript代碼以進行性能? 如何在瀏覽器中優化JavaScript代碼以進行性能? Mar 18, 2025 pm 03:14 PM

本文討論了在瀏覽器中優化JavaScript性能的策略,重點是減少執行時間並最大程度地減少對頁面負載速度的影響。

前端熱敏紙小票打印遇到亂碼問題怎麼辦? 前端熱敏紙小票打印遇到亂碼問題怎麼辦? Apr 04, 2025 pm 02:42 PM

前端熱敏紙小票打印的常見問題與解決方案在前端開發中,小票打印是一個常見的需求。然而,很多開發者在實...

如何使用瀏覽器開發人員工具有效調試JavaScript代碼? 如何使用瀏覽器開發人員工具有效調試JavaScript代碼? Mar 18, 2025 pm 03:16 PM

本文討論了使用瀏覽器開發人員工具的有效JavaScript調試,專注於設置斷點,使用控制台和分析性能。

如何有效地使用Java的收藏框架? 如何有效地使用Java的收藏框架? Mar 13, 2025 pm 12:28 PM

本文探討了Java收藏框架的有效使用。 它強調根據數據結構,性能需求和線程安全選擇適當的收集(列表,設置,地圖,隊列)。 通過高效優化收集用法

如何使用源地圖調試縮小JavaScript代碼? 如何使用源地圖調試縮小JavaScript代碼? Mar 18, 2025 pm 03:17 PM

本文說明瞭如何使用源地圖通過將其映射回原始代碼來調試JAVASCRIPT。它討論了啟用源地圖,設置斷點以及使用Chrome DevTools和WebPack之類的工具。

開始使用Chart.js:PIE,DONUT和BUBBLE圖表 開始使用Chart.js:PIE,DONUT和BUBBLE圖表 Mar 15, 2025 am 09:19 AM

本教程將介紹如何使用 Chart.js 創建餅圖、環形圖和氣泡圖。此前,我們已學習了 Chart.js 的四種圖表類型:折線圖和條形圖(教程二),以及雷達圖和極地區域圖(教程三)。 創建餅圖和環形圖 餅圖和環形圖非常適合展示某個整體被劃分為不同部分的比例。例如,可以使用餅圖展示野生動物園中雄獅、雌獅和幼獅的百分比,或不同候選人在選舉中獲得的投票百分比。 餅圖僅適用於比較單個參數或數據集。需要注意的是,餅圖無法繪製值為零的實體,因為餅圖中扇形的角度取決於數據點的數值大小。這意味著任何占比為零的實體

誰得到更多的Python或JavaScript? 誰得到更多的Python或JavaScript? Apr 04, 2025 am 12:09 AM

Python和JavaScript開發者的薪資沒有絕對的高低,具體取決於技能和行業需求。 1.Python在數據科學和機器學習領域可能薪資更高。 2.JavaScript在前端和全棧開發中需求大,薪資也可觀。 3.影響因素包括經驗、地理位置、公司規模和特定技能。

See all articles