2012-07-17 11 views
52

Cuando se usa knockout, ¿cuál es la ventaja de usar observables calculados de solo lectura en lugar de funciones simples?Knockout: calculado observable frente a la función

tomar las siguientes constructor y de fragmentos de HTML modelo de vista, por ejemplo:

var ViewModel = function(){ 
    var self = this; 
    self.someProperty = ko.observable("abc"); 
    self.anotherProperty = ko.observable("xyz"); 
    self.someComputedProperty = function(){ 
     return self.someProperty() + self.anotherProperty(); 
    };  
}; 

<input data-bind="value: someProperty"/> 
<input data-bind="value: anotherProperty"/> 
<p data-bind="text: someComputedProperty()"></p> 

Todo aquí parece funcionar como era de esperar, por lo que hay una razón por la que debe utilizar en su lugar:

​var ViewModel = function(){ 
    var self = this; 
    self.someProperty = ko.observable("abc"); 
    self.anotherProperty = ko.observable("xyz"); 
    self.someComputedProperty = ko.computed(function(){ 
     return self.someProperty() + self.anotherProperty(); 
    });  
}; 


<input data-bind="value: someProperty"/> 
<input data-bind="value: anotherProperty"/> 
<p data-bind="text: someComputedProperty"></p> 

Noté que la documentación en http://knockoutjs.com/documentation/computedObservables.html indica que "... las encuadernaciones declarativas se implementan simplemente como observables calculados", ¿significa que tengo que usarlas explícitamente en mis viewmodels?

Respuesta

71

Si el único propósito de su observable calculado es hacer un enlace simple en contra de él, entonces usar una función sería equivalente. Los enlaces se implementan dentro de un observable calculado para rastrear las dependencias, por lo que volverá a activar su enlace cuando cualquiera de los observables cambie.

Aquí están algunas cosas a considerar sobre los observables calculadas frente a una función

  • el valor de un observable calculada se almacena en caché, por lo que sólo se actualiza cuando se crea y se actualiza cuando una dependencia. Para una función regular, necesitaría ejecutar la lógica cada vez. Si muchas cosas dependen de ese valor (digamos que cada elemento de una colección se vincula con un valor del padre), entonces esta lógica se ejecutará una y otra vez.

  • en su JavaScript, también puede usar observables computados como lo haría con otros observables. Esto significa que puede crear suscripciones manuales en su contra y depender de ellas a partir de otros cómputos (llamar a una función también crearía esta dependencia). Puede confiar en los métodos de utilidad normales en KO como ko.utils.unwrapObservable para determinar genéricamente si necesita llamarlo como una función o no para recuperar el valor.

  • Si en última instancia desea enviar el valor al servidor, un resultado calculado aparecerá naturalmente en su salida JSON, mientras que un valor que es el resultado de una función normal simplemente desaparecerá cuando se convierta a JSON (tendría hacer más trabajo para poblar una propiedad de esa función primero).

+0

Gran respuesta: gracias! – Duncan

+1

Buena respuesta. A veces uso una función en lugar de una calculada cuando QUIERO que se ejecute la lógica completa cada vez. –

+1

¿cómo sabe que un observable calculado depende de otro observable, cuando todo lo que pasé fue una función? ¿Analiza esa función? - Es hora de leer el código fuente del knockout supongo – zod

Cuestiones relacionadas