Knockout.JS - Cosa sta succedendo esattamente con l'osservabile in questo esempio?

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

  •  25-10-2019
  •  | 
  •  

Domanda

Attualmente sto cercando di imparare Knockout.JS - Sono anche relativamente nuovo a JavaScript stesso.

C'è un esempio sul sito web - http://knockoutjs.com/examples/clickCounter.html - che attualmente sto cercando di capire.

Ho inserito alcuni commenti nel codice seguente con quello che penso stia succedendo.E c'è una domanda su come funziona la funzione.

Sarebbe fantastico se qualcuno con più esperienza in Knockout potesse spiegare esattamente cosa sta succedendo lì.Grazie.

 (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());      


});
È stato utile?

Soluzione

Immagino che la tua confusione sia con questa riga:

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

numberOfClicks è un osservabile, non un numero, quindi + non è definito per questo.

Quando chiami numberOfClicks() che "scarta" l'osservabile nel valore sottostante (il numero).Credo che chiamare un osservabile come funzione con un singolo argomento aggiorni il valore, quindi this.numberOfClicks(1+1) imposterebbe il valore di numberOfClicks a 2.

Altri suggerimenti

this.numberOfClicks; è un osservabile. Questo è un knockoutjs di tipo speciale inserito per permetterti di legarsi a due vie agli elementi DOM. Ogni volta che questa proprietà viene modificata, qualsiasi elemento DOM che è vincolato ad essa aggiornerà automaticamente il loro valore.

Accedi e imposti osservabili come se fossero funzioni, poiché in realtà sono funzioni sotto le copertine.

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

this.hasClickedTooManyTimes è un dependentObservable, che è simile a un osservabile, tranne che è una funzione. Come gli osservabili regolari, questi possono essere legati anche agli elementi DOM. quando hasClickedTooManyTimes viene eseguito, il knockout manterrà traccia - sotto le copertine - di su cui si basa e ogni volta che uno di uno qualsiasi di loro Modifica, il sistema di vincolo saprà di aggiornare tutto ciò a cui è legato hasClickedTooManyTimes

Quindi per questo particolare esempio:

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

Ogni volta numberOfClicks viene aggiornato, tutto ciò che è destinato a hasClickedTooManyTimes volere automaticamente Aggiornamento stesso.

E quello this Il parametro che passi alla funzione dipendente da parte è solo un po 'di zucchero sintattico per ottenere this comportarsi correttamente.

Ecco il Video fantastico che per primo mi ha fatto conoscere Knockoutjs

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top