knockout for data concatenate knockout.js knockout-3.0

knockout.js - data - knockout js for



KnockoutJS: calculado frente a puroComputado (2)

¿Cuál es la diferencia entre computed y pureComputed en KnockoutJS?

¿Puedo usar pureComputed lugar de computed manera segura?


Ellos son muy similares. knockoutjs.com/documentation/computed-pure.html que pureComputed tiene algunas optimizaciones de rendimiento y trata de evitar fugas de memoria, al ser inteligente acerca de quién está rastreando sus cambios.

Puede reemplazar de forma segura computed with pureComputed en muchos casos. La función dentro de la calculada debería seguir esto :

1.Evaluar el observable calculado no debería causar ningún efecto secundario.

2. El valor del observable calculado no debe variar en función del número de evaluaciones u otra información "oculta". Su valor debe basarse únicamente en los valores de otros observables en la aplicación, que para la definición de función pura se consideran sus parámetros.

Así que, como regla general, cualquier observable calculado que simplemente transforme algunas propiedades observable regulares debería estar bien como pureComputed ; de lo contrario, se pureComputed en el computed .

La documentación tiene explicaciones decentes de cuándo / por qué no debe usar pureComputed observables. Aquí hay un extracto relevante:

No debe usar la característica pura para un observable calculado que está destinado a realizar una acción cuando cambian sus dependencias.

La razón por la que no debe usar un cálculo puro si el evaluador tiene efectos secundarios importantes es simplemente que el evaluador no se ejecutará siempre que el computador no tenga suscriptores activos (y por lo tanto esté durmiendo). Si es importante que el evaluador se ejecute siempre cuando cambian las dependencias, utilice un cálculo ordinario en su lugar.


Estoy de acuerdo con @Jeroen y me gustaría agregar un pequeño ejemplo del book de J. Munro que me ayudó mucho, así que esto podría ser útil para otros también.

En primer lugar, los observados puros son bastante similares a los observables calculados con varias mejoras de rendimiento y memoria. El nombre se toma prestado del término de programación de la función Pure y significa que cualquier función que use solo la variable local es potencialmente pura, mientras que cualquier función que use una variable no local es potencialmente impura.

Los observables en Knockout.js se tratan de manera diferente. Así, los observables puros se colocan en modo de suspensión (Knockout inclina todas las dependencias y vuelve a evaluar el contenido cuando se lee) y los observables computados se colocan en modo de escucha (Knockout comprueba constantemente si el valor está actualizado antes del primer acceso) .

Por lo tanto, si necesita ejecutar otro código, entonces es mejor usar un observables computados.

function ViewModel() { var self = this; self.firstName = ko.observable(''Arshile''); self.lastName = ko.observable(''Gorky''); self.pureComputedExecutions = 0; self.computedExecutions = 0; self.pureComputedFullName = ko.pureComputed(function() { // This is NOT recommended self.pureComputedExecutions++; return ''Hello '' + self.firstName() + '' '' + self.lastName(); }); self.computedFullName = ko.computed(function() { self.computedExecutions++; return ''Hello '' + self.firstName() + '' '' + self.lastName(); }); }; var viewModel = new ViewModel(); ko.applyBindings(viewModel); alert(''Pure computed executions: '' + viewModel.pureComputedExecutions); alert(''Computed executions: '' + viewModel.computedExecutions);

Cuando se ejecuta este código, se muestran dos mensajes de alerta que muestran la cantidad de veces que se invocan las funciones compiladas y purificadas. Como pureComputed está en modo de suspensión, nunca se ha accedido a la función y el contador mostrará 0. A diferencia de esto, la función calculada se evalúa automáticamente en el enlace de datos, lo que hace que el contador incremente el número y muestre 1.