- KnockoutJS 教程
- KnockoutJS - 首頁
- KnockoutJS - 概述
- KnockoutJS - 環境設定
- KnockoutJS - 應用
- KnockoutJS - MVVM 框架
- KnockoutJS - 可觀察物件
- 計算可觀察物件
- KnockoutJS - 宣告式繫結
- KnockoutJS - 依賴項跟蹤
- KnockoutJS - 模板
- KnockoutJS - 元件
- KnockoutJS 資源
- KnockoutJS - 快速指南
- KnockoutJS - 資源
- KnockoutJS - 討論
KnockoutJS - 依賴項跟蹤
KnockoutJs 在值更新時會自動跟蹤依賴項。它有一個名為依賴項跟蹤器 (ko.dependencyDetection) 的單個物件,充當雙方之間訂閱依賴項的中間體。
以下是依賴項跟蹤的演算法。
步驟 1 - 每當你宣告一個計算可觀察物件時,KO 會立即呼叫其評估函式以獲取其初始值。
步驟 2 - 為評估器讀取的任何可觀察物件設定訂閱。在應用程式中,不再使用的舊訂閱將被釋放。
步驟 3 - KO 最終會通知更新的計算可觀察物件。
示例
<!DOCTYPE html>
<html>
<head>
<title>KnockoutJS How Dependency Tracking Works</title>
<!-- CDN's-->
<script src = "https://ajax.aspnetcdn.com/ajax/knockout/knockout-3.1.0.js"
type = "text/javascript"></script>
</head>
<body>
<div>
<form data-bind = "submit: addFruits">
<b>Add Fruits:</b>
<input data-bind = 'value: fruitToAdd, valueUpdate: "afterkeydown"'/>
<button type = "submit" data-bind = "enable: fruitToAdd().length > 0">Add</button>
<p><b>Your fruits list:</b></p>
<select multiple = "multiple" width = "50" data-bind = "options: fruits"> </select>
</form>
</div>
<script>
var Addfruit = function(fruits) {
this.fruits = ko.observableArray(fruits);
this.fruitToAdd = ko.observable("");
this.addFruits = function() {
if (this.fruitToAdd() != "") {
this.fruits.push(this.fruitToAdd()); // Adds a fruit
this.fruitToAdd(""); // Clears the text box
}
}.bind(this); // "this" is the view model
};
ko.applyBindings(new Addfruit(["Apple", "Orange", "Banana"]));
</script>
</body>
</html>
輸出
讓我們執行以下步驟來檢視上述程式碼是如何工作的:
將上述程式碼儲存在dependency_tracking.htm檔案中。
在瀏覽器中開啟此 HTML 檔案。
輸入任何水果名稱並點選“新增”按鈕。
使用 Peek 控制依賴項
可以使用peek函式訪問計算可觀察物件,而無需建立依賴項。它透過更新計算屬性來控制可觀察物件。
示例
<!DOCTYPE html>
<html>
<head>
<title>KnockoutJs Controlling Dependencies Using Peek</title>
<!-- CDN's-->
<script src = "https://ajax.aspnetcdn.com/ajax/knockout/knockout-3.1.0.js"
type = "text/javascript"></script>
</head>
<body>
<div class = "logblock">
<h3>Computed Log</h3>
<pre class = "log" data-bind = "html: computedLog"></pre>
</div>
<script>
function AppData() {
this.firstName = ko.observable('John');
this.lastName = ko.observable('Burns');
this.computedLog = ko.observable('Log: ');
this.fullName = ko.computed(function () {
var value = this.firstName() + " " + this.lastName();
this.computedLog(this.computedLog.peek() + value + '; <br/>');
return value;
}, this);
this.step = ko.observable(0);
this.next = function () {
this.step(this.step() === 2 ? 0 : this.step()+1);
};
};
ko.applyBindings(new AppData());
</script>
</body>
</html>
輸出
讓我們執行以下步驟來檢視上述程式碼是如何工作的:
將上述程式碼儲存在dependency_tracking_peek.htm檔案中。
在瀏覽器中開啟此 HTML 檔案。
觀察結果
忽略計算依賴項中的依賴項
ko.ignoreDependencies函式有助於忽略你不想在計算依賴項中跟蹤的那些依賴項。以下是其語法。
ko.ignoreDependencies( callback, callbackTarget, callbackArgs );
為什麼迴圈依賴項沒有意義
如果 KO 正在評估計算可觀察物件,則它不會重新啟動對依賴計算可觀察物件的評估。因此,在你的依賴鏈中包含迴圈是沒有意義的。
廣告