Quando si dispone di un array osservabile con elementi non osservabili e alcune proprietà di uno degli elementi nell'array cambia , se si desidera aggiornare solo elemento, è possibile utilizzare indexOf
e splice
, in questo modo:
var changedIdx = obsArray.indexOf(changedItem);
obsArray.splice(changedIdx , 1); // removes the item from the array
obsArray.splice(changedIdx , 0, changedItem); // adds it back
quello che fa, è alla ricerca per l'elemento della matrice, rimuoverlo, e inserendolo di nuovo. Quando viene inserito di nuovo, l'elemento viene associato di nuovo, con i nuovi valori.
Se ti piace questa soluzione, è possibile estendere la funzionalità di tutte le matrici osservabili ko, in questo modo:
ko.observableArray.fn.refresh = function (item) {
var index = this['indexOf'](item);
if (index >= 0) {
this.splice(index, 1);
this.splice(index, 0, item);
}
}
Poi, quando si modifica un elemento di un array, è sufficiente per effettuare la chiamata:
obsArray.refresh(changedItem);
Se si dispone di molti elementi in vostro allineamento si otterrà una migliore performace rispetto alla dirty
aggiornamento di Artem Vyshniakov, che aggiorna le associazioni per tutti gli elementi della matrice, e non solo per la cambiata di una .
Nota: il valueHasMutated
, appart venga documentato (e per uso interno, immagino), controlla solo se la matrice stessa è cambiata, non se gli elementi non osservabili nella matrice sono cambiati, così doesn' lavoro. Cioè rileva solo se sono stati aggiunti elementi alla matrice, elementi rimossi dall'array, elementi modificati della matrice con nuovi elementi diversi o modificato l'ordine degli elementi. Ma non controlla se gli elementi stessi sono stati modificati
Questo ancora non aggiorna l'interfaccia utente per me – user1166905
valoreHasMutated ha funzionato bene per me. – Edyn
perché è necessario creare una copia dell'array chiamando slice (0)? anche il seguente funziona e ancora meglio 'var data = self.array(); self.array (null); self.array (data);' –