working purecomputed not knockout example databind data knockout.js knockout-2.0 computed-observable

knockout.js - purecomputed - visible knockout example



Knockout: observable computable vs función (1)

Al usar knockout, ¿cuál es la ventaja de usar observables calculados de solo lectura en lugar de funciones simples?

Tome el siguiente constructor de viewmodel y html snippet, 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 es de esperar, entonces ¿hay alguna razón por la cual debería usar:

​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>

Observé que la documentación en http://knockoutjs.com/documentation/computedObservables.html establece que "... las consolidaciones declarativas simplemente se implementan como observables computados", entonces eso significa que necesito usarlas explícitamente en mis viewmodels ?


Si el único propósito de su observable calculado es hacer un enlace simple contra é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í hay algunas cosas a considerar sobre observables computados vs. una función

  • el valor de un observable calculado se almacena en caché, por lo que solo se actualiza cuando se crea y cuando se actualiza 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, naturalmente aparecerá un observable calculado 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 que trabajar más para poblar una propiedad desde esa función primero).