KnockoutJS - Varios modelos de vista en una sola vista
Estoy pensando que mi aplicación se está haciendo bastante grande ahora, demasiado grande para manejar cada vista con un solo ViewModel.
Así que me pregunto lo difícil que sería crear varios ViewModels y cargarlos todos en una sola vista. Con una nota que también necesito ser capaz de pasar X ViewModel datos en Y ViewModel datos para que los ViewModels individuales necesitan ser capaces de comunicarse entre sí o al menos ser conscientes de los demás.
Por ejemplo tengo un <select>
desplegable, ese select desplegable tiene un estado seleccionado que me permite pasar el ID del elemento seleccionado en el <select>
a otra llamada Ajax en un ViewModel separado....
Cualquier punto sobre el tratamiento de numerosos modelos de vista en una sola vista apreciada:)
5 answers
Si todos necesitan estar en la misma página, una manera fácil de hacerlo es tener un modelo de vista maestro que contenga una matriz (o lista de propiedades) de los otros modelos de vista.
masterVM = {
vmA : new VmA(),
vmB : new VmB(),
vmC : new VmC(),
}
Entonces su masterVM
puede tener otras propiedades si es necesario, para la página misma. 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 del masterVM
, o podría utilizar el $parent
/ $root
en enlaces, o algunas otras opciones personalizadas.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-07-01 18:07:19
Knockout ahora admite la unión de modelos múltiples. El método ko.applyBindings()
toma un parámetro opcional: el elemento y sus descendientes al que se activará el enlace.
Por ejemplo:
ko.applyBindings(myViewModel, document.getElementById('someElementId'))
Esto restringe la activación al elemento con ID someElementId
y sus descendientes.
Ver documentación para más detalles.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-05-26 09:55:49
Esta es mi respuesta después de completar un proyecto muy grande con muchos ViewModels en una sola vista.
Vista html
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<title></title>
</head>
<body>
<div id="container1">
<ul>
<li >Container1 item</li>
<!-- ko foreach: myItems -->
<li>Item <span data-bind="text: $data"></span></li>
<!-- /ko -->
</ul>
</div>
<div id="container2">
<ul>
<li >Container2 item</li>
<!-- ko foreach: myItems -->
<li>Item <span data-bind="text: $data"></span></li>
<!-- /ko -->
</ul>
</div>
<script src="js/jquery-1.11.1.js"></script>
<script src="js/knockout-3.0.0.js"></script>
<script src="js/DataFunction.js"></script>
<script src="js/Container1ViewModel.js"></script>
<script src="js/Container2ViewModel.js"></script>
</body>
</html>
Para esta vista estoy creando 2 modelos de vista para id=container1 e id=container2 en dos archivos javascript separados.
Container1ViewModel.js
function Container1ViewModel()
{
var self = this;
self.myItems = ko.observableArray();
self.myItems.push("ABC");
self.myItems.push("CDE");
}
Container2ViewModel.js
function Container2ViewModel() {
var self = this;
self.myItems = ko.observableArray();
self.myItems.push("XYZ");
self.myItems.push("PQR");
}
Luego, después de estos 2 viewmodels se registran como viewmodels separados en DataFunction.js
var container1VM;
var container2VM;
$(document).ready(function() {
if ($.isEmptyObject(container1VM)) {
container1VM = new Container1ViewModel();
ko.applyBindings(container1VM, document.getElementById("container1"));
}
if ($.isEmptyObject(container2VM)) {
container2VM = new Container2ViewModel();
ko.applyBindings(container2VM, document.getElementById("container2"));
}
});
Así puedes añadir cualquier número de viewmodels para divs separados. Pero asegúrese de no crear un modelo de vista separado para un div dentro del div registrado.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-07-16 13:29:54
Compruebe el plugin MultiModels para Knockout JS - https://github.com/sergun/Knockout-MultiModels
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-06-27 16:09:23
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 knob-button en varios lugares.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-06-28 20:15:55