Matriz observable empujar mĂșltiples objetos en knockout.js
(3)
Se ha discutido una función pushAll
en github, ver, por ejemplo, here o esta solicitud de extracción . Por lo que yo sé, aún no ha llegado al código principal.
Sin embargo, puedes lograr fácilmente un push-all así:
var items = ko.observableArray();
items.push.apply(items, [1, 2, 3, 4]);
como lo comentó stalniy en la segunda referencia. La desventaja de esto es que el knockout notificará a los suscriptores después de cada elemento empujado.
Alternativamente,
function concat(the_list, items_to_concat) {
the_list.splice.apply(the_list, [the_list().length, 0].concat(items_to_concat));
}
haciendo uso de la implementación de splice
observableArray
, como lo sugiere brianmhunt en el mismo hilo.
Por cierto: admito que no sabía esto de memoria, simplemente busqué en Google "push many knockout"
¿Hay alguna opción en ko, que empuje múltiples elementos al mismo tiempo?
Tengo dos elementos que deben insertarse en una matriz observable llamada StatesList
, no puedo avanzar más. ¿Cómo puedo agregarlos a ambos?
vea abajo:
var model1 = jQuery.parseJSON(ko.toJSON(argsToPost));
var model = jQuery.parseJSON(ko.toJSON(self.StateModel));
necesito agregar ambos a mi ObservableArray
self.StatesList.push(model);
self.StatesList.push(model1);
Esto es insertar en diferentes registros, quiero insertar ambos objetos al mismo tiempo
Tenemos ko.utils.arrayPushAll(array, valuesToPush)
como una función de utilidad que puede usar. Sin embargo, no está disponible directamente a través de los arreglos observables .
Si agrega su pushAll to observableArrays
, querrá operar en el arreglo subyacente (this () en su caso) y luego invocar valueHasMutated()
en el observableArray
al final. Esto asegurará que los suscriptores de observableArray
solo se notifiquen una vez con el resultado final en lugar de con cada impulso.
En KO core, necesitaría llamar a valueWillMutate()
antemano también.
El punto era que no recomendaría usar el código que publicaste, ya que notificará en cada impulso, lo que puede tener un impacto en el rendimiento si empujas muchos elementos.
En core, podríamos hacer algo como:
ko.observableArray.fn.pushAll = function(valuesToPush) {
var underlyingArray = this();
this.valueWillMutate();
ko.utils.arrayPushAll(underlyingArray, valuesToPush);
this.valueHasMutated();
return this; //optional
};
La misma discusión ocurrió entre John Papa
y RP Niemeyer
. El enlace se puede encontrar here . Por lo tanto, solo se publicaron consejos útiles como respuesta aquí.
Tratar
ko.utils.arrayPushAll(self.StatesList, [model, model1]);