Учебники

KnockoutJS — Отслеживание зависимостей

KnockoutJs автоматически отслеживает зависимости, когда значения обновляются. У него есть единственный объект, называемый трекером зависимостей (ko.dependencyDetection), который действует как промежуточное звено между двумя сторонами для подписки зависимостей.

Ниже приведен алгоритм отслеживания зависимостей.

отслеживание зависимостей

Шаг 1 — Всякий раз, когда вы объявляете вычисляемую наблюдаемую, KO немедленно вызывает свою функцию оценки, чтобы получить ее начальное значение.

Шаг 2 — Подписка настраивается на любое наблюдаемое, что читает оценщик. В приложении удаляются старые подписки, которые больше не используются.

Шаг 3 — нокаут наконец-то уведомляет обновленную вычисляемую наблюдаемую.

пример

Live Demo

<!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, обновляя вычисляемое свойство.

пример

Live Demo

<!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 оценивает вычисляемую наблюдаемую, то она не будет перезапускать оценку зависимой вычисляемой наблюдаемой. Следовательно, нет смысла включать циклы в ваши цепочки зависимостей.