2012-04-13 16 views
11

KnockoutJS ha il concetto di osservabili calcolati, che sono funzioni che dipendono da uno o più oggetti osservabili. Knockout è in grado di determine the dependencies of a computed observable as described in the docs:KnockoutJS - Come funzionano gli osservabili calcolati con istruzioni condizionali

Ogni volta che si dichiara una osservabile, KO invoca immediatamente la sua funzione di valutatore calcolata per ottenere il suo valore iniziale. Mentre la tua funzione di valutazione è in esecuzione, KO mantiene un registro di tutti gli osservabili (o gli osservabili calcolati da ) che il tuo valutatore legge il valore di.

Ora, ciò che non capisco è, come funziona se il tuo osservabile calcolato contiene una logica condizionale. Se Knockout richiama la funzione di valutazione, sicuramente la logica condizionale potrebbe risultare in osservabili che la funzione dipende dal fatto di non essere invocati?

Ho creato questo piano rispetto a prova:

http://jsfiddle.net/bJK98/

var ViewModel = function(first, last) { 
    this.firstName = ko.observable(first); 
    this.lastName = ko.observable(last); 
    this.condition = ko.observable(false); 

    // at the point of evaluation of this computed observabled, 'condition' 
    // will be false, yet the dependecy to both firstName and lastName is 
    // identified 
    this.fullName = ko.computed(function() { 
     return this.condition() ? this.firstName() : this.lastName(); 
    }, this); 
}; 

Tuttavia, in qualche modo Knockout correttamente identificato la dipendenza sia firstName e lastName.

Qualcuno può spiegare come?

+0

Impossibile ottenere la domanda, credo che gli osservabili calcolati determinino il proprio stato in fase di esecuzione valutando tutte le dipendenze, quindi tutto sembra chiaro e diretto, scusa ma non è possibile ottenere un punto principale della domanda – sll

+2

Buona domanda.Ho sempre pensato che l'approccio che descrivono nel manuale, come hai citato, fosse abbastanza intelligente, ma ora che lo fai notare, mi chiedo se sia molto intelligente e non solo piuttosto intelligente ...: D –

risposta

12

le dipendenze vengono tracciate di nuovo ogni volta che viene rivalutato un dipendente dipendente. Quindi, se hai una logica condizionale, il ramo che non viene colpito non contribuirà alle dipendenze.

Nel proprio violino, se si modifica firstName, il valore non viene aggiornato fino a quando non si attiva condition. A quel punto, lastName non è più una dipendenza, quindi le modifiche ad esso non attivano il dipendente Osservabile.

Non è molto più complesso della descrizione originale. La cosa fondamentale da ricordare è che le dipendenze vengono registrate ogni volta che viene rivalutata.

0

Nelle dipendenze knockout vengono tracciate tramite la variabile single tracker ko.dependencyDetection.

  1. Quindi ogni volta che si dichiara una variabile calcolata, Knockout richiama immediatamente la funzione di valutatore per ottenere il valore iniziale e le dipendenze.
  2. Quindi durante questa prima chiamata registrerà le dipendenze dalle variabili lastName e condition.
  3. Ora ogni volta che si modifica lastName aggiornerà tutti i valori dipendenti.
  4. E ogni volta che si cambia condition, si esegue nuovamente la funzione di valutazione e si aggiornano tutte le dipendenze. Quindi aggiungerà firstName come dipendenza e rimuovere lastName.

Quindi, questo è il modo in cui il monitoraggio delle dipendenze funziona a eliminazione diretta.

Problemi correlati