- KnockoutJS Tutorial
- KnockoutJS - Home
- KnockoutJS - Overview
- KnockoutJS - Environment Setup
- KnockoutJS - Application
- KnockoutJS - MVVM Framework
- KnockoutJS - Observables
- Computed Observables
- KnockoutJS - Declarative Bindings
- KnockoutJS - Dependency Tracking
- KnockoutJS - Templating
- KnockoutJS - Components
- KnockoutJS Resources
- KnockoutJS - Quick Guide
- KnockoutJS - Resources
- KnockoutJS - Discussion
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函数,可以在不创建依赖项的情况下访问计算的可观察量。它通过更新计算属性来控制 Observable。
例子
<!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 正在评估 Computed Observable,那么它不会重新启动对依赖的 Computed Observable 的评估。因此,在依赖链中包含循环是没有意义的。