Nockout.js - Что именно происходит с наблюдаемым в этом примере?

StackOverflow https://stackoverflow.com/questions/8304540

  •  25-10-2019
  •  | 
  •  

Вопрос

В настоящее время я пытаюсь выучить nockout.js - я также относительно новичок в самом JavaScript.

На сайте есть пример - http://knockoutjs.com/examples/clickcounter.html - Что я сейчас пытаюсь обернуть голову.

Я вложил несколько комментариев в код ниже с тем, что, я думаю, происходит. И есть вопрос о том, как работает функция.

Было бы здорово, если бы кто -то более опытный в нокауте мог бы объяснить именно то, что там происходит. Спасибо.

 (function() {  

    var clickCounterViewModel = function () {

    // Here it looks like numberOfClicks is assigned the value 0 and wrapped in a ko.observable method 
    // that allows any changes of it to ripple throughout the application.
    this.numberOfClicks = ko.observable(0);  

    //  A function is created called registerClick and assigned to the ViewModel.
    //  The value of numberOfClicks is currently 0.  
    this.registerClick = function () {

        //  numberOfClicks is being used here as a method, but it was created as a property.
        //  It almost looks like I could write:  this.numberOfClicks = this.numberOfClicks() + 1,
        //  however, that doesn't work.  this.numberOfClicks is being passed into itself as an argument.
        //  Is this some sort of recursion?  Can someone familiar with Knockout please explain how this is working?
        this.numberOfClicks(this.numberOfClicks() + 1);  
    }

    this.hasClickedTooManyTimes = ko.dependentObservable(function () {
        return this.numberOfClicks() >= 3;
    }, this);
};

ko.applyBindings(new clickCounterViewModel());      


});
Это было полезно?

Решение

Я беру это, твоя путаница с этой линией:

this.numberOfClicks(this.numberOfClicks() + 1);  

numberOfClicks это наблюдаемое, а не число, поэтому + не определено для этого.

При звонке numberOfClicks() что «разворачивает», наблюдаемое в базовом значении (число). Я считаю, что называть наблюдаемую функцию с одним аргументом обновляет значение, поэтому this.numberOfClicks(1+1) установил бы значение numberOfClicks до 2.

Другие советы

this.numberOfClicks; это наблюдаемый. Это специальный тип нокаутирования, который позволяет двустороннему привязке с элементами DOM. Всякий раз, когда это свойство изменяется, любые элементы DOM, которые связаны с ним, автоматически обновляют свое значение.

Вы получаете доступ и устанавливаете наблюдаемые, как если бы они были функциями, поскольку они на самом деле являются функциями под обложками.

clickCounterViewModel.numberOfClicks(99);
var numClicksInViewModel = clickCounterViewModel.numberOfClicks(99);
//numClicksInViewModel == 99

this.hasClickedTooManyTimes это dependentObservable, что аналогично наблюдаемому, за исключением того, что это функция. Как и обычные наблюдаемые, они также могут быть связаны с элементами DOM. Когда hasClickedTooManyTimes выполняется, нокаут будет отслеживать - при обложках - на какие наблюдаемые он полагается, и всякий раз, когда кто -то из их Изменение, система привязки будет знать, чтобы обновить все, что связано с hasClickedTooManyTimes

Итак, для этого конкретного примера:

this.hasClickedTooManyTimes = ko.dependentObservable(function () {
    return this.numberOfClicks() >= 3;
}, this);

Когда бы ни numberOfClicks обновляется, все, что связано hasClickedTooManyTimes будут автоматически обновление само.

И это this Параметр, который вы передаете к функции зависимости, представляют собой лишь небольшой синтаксический сахар, чтобы получить this вести себя правильно.

Вот Фантастическое видео это впервые познакомило меня с нокаутированием

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top