Estoy pensando que mi aplicación se está volviendo bastante grande ahora, demasiado grande para manejar cada vista con un único modelo de vista.
Así que me pregunto qué difícil sería crear múltiples ViewModels y cargarlos todos en una sola Vista. Con una nota de que también necesito poder pasar los datos de X ViewModel a los datos de Y ViewModel , por lo que los ViewModels individuales deben poder comunicarse entre sí o al menos ser conscientes de ellos.
Por ejemplo, tengo un <select>
menú desplegable, ese menú desplegable de selección tiene un estado seleccionado que me permite pasar la ID del elemento seleccionado en <select>
otra llamada Ajax en un ViewModel separado ...
Cualquier punto sobre el trato con numerosos ViewModels en una sola Vista apreciado :)
masterVM
.Respuestas:
Si todos necesitan estar en la misma página, una forma fácil de hacerlo es tener un modelo de vista maestra que contenga una matriz (o lista de propiedades) de los otros modelos de vista.
Entonces
masterVM
puede tener otras propiedades si es necesario, para la página en sí. La comunicación entre los modelos de vista no sería difícil en esta situación, ya que podría transmitir a través demasterVM
, o podría usar los enlaces$parent
/$root
in, o algunas otras opciones personalizadas.fuente
with:
enlace, por lo que no se repetiráKnockout ahora admite el enlace de varios modelos. El
ko.applyBindings()
método toma un parámetro opcional: el elemento y sus descendientes a los que se activará el enlace.Por ejemplo:
Esto restringe la activación al elemento con ID
someElementId
y sus descendientes.Ver documentación para más detalles.
fuente
[0]
para especificar un elemento DOM real (en lugar del objeto jQuery) así:ko.applyBindings(myViewModel, $('#someElementId')[0])
Esta es mi respuesta después de completar un proyecto muy grande con muchos ViewModels en una sola vista.
Vista HTML
Para esta vista, estoy creando 2 modelos de vista para id = container1 e id = container2 en dos archivos javascript separados.
Container1ViewModel.js
Container2ViewModel.js
Luego, después de que estos 2 modelos de vista se registren como modelos de vista separados en DataFunction.js
De esta manera, puede agregar cualquier número de modelos de vista para divs separados. Pero asegúrese de no crear un modelo de vista separado para un div dentro del div registrado.
fuente
Verifique el complemento MultiModels para Knockout JS - https://github.com/sergun/Knockout-MultiModels
fuente
Usamos componentes para lograr eso. ( http://knockoutjs.com/documentation/component-overview.html )
Por ejemplo, tenemos esta biblioteca de componentes que estamos desarrollando: https://github.com/EDMdesigner/knobjs
Si profundiza en el código, verá que, por ejemplo, reutilizamos el componente del botón en varios lugares.
fuente