2012-04-13 24 views
11

KnockoutJS tiene el concepto de observables calculados, que son funciones que dependen de uno o más observables. Knockout es capaz de determine the dependencies of a computed observable as described in the docs:KnockoutJS - Cómo funcionan los observables calculados con sentencias condicionales

Cuando se declara un KO invoca inmediatamente su función observable, evaluador computarizada para obtener su valor inicial. Mientras su función de evaluador se está ejecutando, KO mantiene un registro de los observables (o observables observables) que su evaluador lee el valor de.

Ahora, lo que no entiendo es cómo funciona esto si su observable calculado contiene lógica condicional. Si Knockout invoca la función del evaluador, seguramente la lógica condicional podría dar como resultado observables cuya función depende de que no se invoque.

he creado este violín a prueba:

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

Sin embargo, de alguna manera Knockout identificó correctamente la dependencia a la vez firstName y lastName.

¿Alguien puede explicar cómo?

+0

No puedo entender la pregunta, creo que los observables calculados determinan el estado en tiempo de ejecución evaluando todas las dependencias, por lo que todo parece claro y directo, lo siento pero no puedo obtener un punto principal de su pregunta – sll

+2

Buena pregunta.Siempre pensé que el enfoque que describen en el manual, tal como lo citó, fue bastante inteligente, pero ahora que usted señala esto, me pregunto si es muy inteligente y no solo bastante inteligente ...: D –

Respuesta

12

las dependencias se rastrean de nuevo cada vez que se vuelve a evaluar un dependienteObservable. Por lo tanto, si tiene una lógica condicional, entonces la rama que no se golpea no contribuirá a las dependencias.

En su violín, si edita el firstName, entonces el valor no se actualiza hasta que cambie condition. En ese punto, lastName ya no es una dependencia, por lo que los cambios no desencadenan dependObservable.

No es realmente más complejo que la descripción original. Lo básico para recordar es que las dependencias se registran cada vez que se vuelve a evaluar.

0

En las dependencias knockout se rastrean a través de su variable de rastreador único ko.dependencyDetection.

  1. Por lo tanto, cada vez que declara una variable calculada Knockout invoca inmediatamente su función de evaluador para obtener su valor inicial y sus dependencias.
  2. Por lo tanto, durante esta primera llamada registrará sus dependencias en las variables lastName y condition.
  3. Ahora cuando lastName cambia, actualizará todos sus valores dependientes.
  4. Y siempre que condition cambie, se ejecutará nuevamente su función de evaluador y actualizará todas las dependencias. Por lo tanto, agregará firstName como dependencia y eliminará lastName.

Por lo tanto, así es como funciona el seguimiento de la dependencia en el golpe de gracia.

Cuestiones relacionadas