KnockoutJs автоматически отслеживает зависимости, когда значения обновляются. У него есть единственный объект, называемый трекером зависимостей (ko.dependencyDetection), который действует как промежуточное звено между двумя сторонами для подписки зависимостей.
Ниже приведен алгоритм отслеживания зависимостей.
Шаг 1 — Всякий раз, когда вы объявляете вычисляемую наблюдаемую, KO немедленно вызывает свою функцию оценки, чтобы получить ее начальное значение.
Шаг 2 — Подписка настраивается на любое наблюдаемое, что читает оценщик. В приложении удаляются старые подписки, которые больше не используются.
Шаг 3 — нокаут наконец-то уведомляет обновленную вычисляемую наблюдаемую.
пример
<!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 в браузере.
-
Введите название фрукта и нажмите кнопку «Добавить».
Сохраните приведенный выше код в файле dependency_tracking.htm .
Откройте этот файл HTML в браузере.
Введите название фрукта и нажмите кнопку «Добавить».
Управление зависимостями с помощью Peek
Доступ к Computed Observable можно получить без создания зависимости с помощью функции 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 в браузере.
Сохраните приведенный выше код в файле dependency_tracking_peek.htm .
Откройте этот файл HTML в браузере.
наблюдения
Игнорирование зависимостей в пределах вычисленной зависимости
Функция ko.ignoreDependencies помогает игнорировать те зависимости, которые вы не хотите отслеживать в пределах вычисляемых зависимостей. Ниже приводится его синтаксис.
ko.ignoreDependencies( callback, callbackTarget, callbackArgs );
Почему циклические зависимости не имеют смысла
Если KO оценивает вычисляемую наблюдаемую, то она не будет перезапускать оценку зависимой вычисляемой наблюдаемой. Следовательно, нет смысла включать циклы в ваши цепочки зависимостей.