creo que lo mejor es utilizar una matriz asociativa bajo el capó para el rendimiento. También (como lo aludió) necesita utilizar un Arreglo observable para poder rastrear los cambios (porque así es como funciona el nocaut).
Si está buscando una matriz asociativa 'nocautoria', es probable que desee una forma de rastrear los cambios en el elemento (y así afectar a las cadenas de dependencia).
http://jsfiddle.net/rz41afLq/2/
Esto es lo que se me ocurrió que se adaptaba a mis necesidades. Básicamente, almacena un par de valores clave en el observableArray
y utiliza una matriz asociativa estándar para almacenar una copia con fines de búsqueda.
// VIEW MODEL
var viewModel = {
// we have to use observable array to track changes
items: ko.observableArray([]),
// also use associative array for performance
_assoc: {},
update_item: function(key, value) {
// use a true assoc array for performance
// _assoc[key] = ko.observable(value)
if (viewModel._assoc[key])
{
// update observable (overwriting existing item)
viewModel._assoc[key].value(value);
}
else {
// Important: See how we wrap value with an observable to detect changes
this.items.push(viewModel._assoc[key] = { key: key, value: ko.observable(value) });
}
}
};
Así que guarde los perros de esta manera:
update_item('dogs', ['kim', 'abbey', 'goldie', 'rover']);
update_item('dogs', ko.observableArray(['kim', 'abbey', 'goldie', 'rover']));
(La segunda sólo se requiere si usted está planeando en llamar pop()
o push()
en la lista de perros y quiere actualizar la interfaz de usuario Usted. por supuesto, puede llamar al update_item
para actualizar completamente el artículo en cualquier momento, en cuyo caso no es necesario que se observe)
Para buscar un valor, crea dinámicamente un archivo calculado para ir a buscarlo:
var dogs = getValue('dogs');
A continuación, tan pronto como el valor indexado como 'perros' en los cambios de matriz asociativa luego lo observable dogs()
actualizará (y pueden encadenarse). Este dogs
observable se puede ligar a la UI por supuesto
var getValue = function(key) { return ko.pureComputed(function()
{
// reevaluate when item is added or removed to list
// not necessary if the value itself changes
viewModel.items();
var item = viewModel._assoc[key];
return (item == null) ? null : item.value();
}, viewModel);
Gracias RPN. Mi conjunto de datos crecerá a 2K así que no, no veo el rendimiento como un problema. Por cierto, ¿hay una referencia en línea en ko.utils? –
Actualmente no hay documentos para utilidades. El mejor recurso actualmente es de mi blog aquí: http://www.knockmeout.net/2011/04/utility-functions-in-knockoutjs.html –
awesome. ¡Gracias! –