2012-06-18 10 views
5

¿Hay alguna manera en knockout.js para determinardependencias de campos calculados en Knockout

  • que valora (o ko.observableko.computed) dependen unos de otros en qué forma (precedentes) y/dependientes
  • cuales Los nodos HTML (vinculante de texto, para principiantes) dependen del valor actual , por lo que puedo resaltarlos en la pantalla.

?

Esto implica que necesito una manera de pasar de un nodo HTML al ko.subscribable conectados, no sólo para el modelo de vista, al igual que lo hace ko.dataFor(). Esto parece ser imposible también.


He construido una aplicación web que funciona como una hoja de cálculo - muchos valores numéricos que están basados ​​en otros de acuerdo a un conjunto de reglas de negocio. Algunos de ellos se calculan, algunos de ellos provistos por el usuario.

Por el momento estoy usando mi propia biblioteca JS que hace todo el seguimiento de la dependencia y la actualización dinámica de la pantalla. Esto funciona, pero me gustaría cambiarlo por knockout.js para mayor versatilidad y elegancia.

Knockout realiza un seguimiento de esta información en algún lugar. ¿Como puedo usar lo?


Por ejemplo, imaginemos una hoja de cálculo (una tabla HTML) que resume un par de números enteros:

 
    | A B C 
--+--------- 
1 | 4 1 5 
2 | 2 
3 | 3 8 
  • Cuando el usuario hace clic en la celda B3, me gustaría averiguar que depende de B1 y B2 y que C3 depende de ello.
  • Cuando el usuario hace clic en la celda C3, me gustaría saber que depende de A1, B1, C1, B2 y B3.

Respuesta

7

He escrito un plugin for Knockout (2.0+) cuyo objetivo principal es eliminar las actualizaciones duplicadas para los observables calculados. Pero dado que el complemento reemplaza el objeto ko.computed, también he agregado la posibilidad de obtener una lista de las dependencias/dependientes para los observables. Cada objeto calculado tiene un método getDependencies que devuelve una matriz de observables, y cada observable observable/calculado tiene un método getDependents que devuelve una matriz de observables calculados.

+0

Esto se ve bastante prometedor. Supongo que sería bastante fácil aumentarlo así que también sigue los precedentes. Ahora estoy pensando en un enlace personalizado de "texto" que registre automáticamente los elementos HTML conectados, así tengo la oportunidad de llamar a 'getDependents' en un manejador de clics, por ejemplo. – Tomalak

+0

No sé a qué te refieres con "precedentes". –

+0

Terminología de Excel: "Dependientes: valores que dependen del valor actual". "Precedentes: valores de los que depende el valor actual". – Tomalak

4

Esta es una pregunta muy interesante, y parece que no es muy simple de responder. He examinado la fuente de nocaut y parece que esta información se almacena en la propiedad _subscriptionsToDependencies, pero eso no parece estar expuesto públicamente.

Me di cuenta getDependenciesCount que está expuesto - echa un vistazo a this fiddle para verlo en acción.

Todavía estoy investigando esto, pero parece que puede requerir un tenedor de knockout a menos que podamos obtener el observable subyacente. Pero esto es lo que he encontrado hasta ahora, que puede ser útil:

Al ejecutarlo a través del depurador, parece que en el tiempo de ejecución la versión minimizada del knockout cambia el nombre de la propiedad _subscriptionsToDependencies a V. En tiempo de ejecución, el valor de la propiedad getDependenciesCount es: function(){return v.length}

Espero que esto ayude.

Editar: Para aquellos que llegan a esta pregunta buscando la respuesta, no parece ser posible en KnockoutJS a partir de la versión 2.1

+0

Normalmente respondo las preguntas simples por mi cuenta. ;) - Sabiendo que el recuento de dependencias es cercano pero no puro. Además, esto no me dice nada sobre los precedentes. La pregunta "qué elemento HTML muestra este valor" también se me ocurrió en una ocasión diferente en el pasado. Esto parece igualmente difícil de responder. – Tomalak

Cuestiones relacionadas