2013-03-15 3 views
31

Sto tentando di sostituire tutto il contenuto di un articolo in uno observableArray con un nuovo contenuto.Sostituzione dell'articolo nell'osservabileArray

var oldLocation = ko.utils.arrayFirst(self.locations(), function (item) { 
    return item.id == value.id; 
}); 
self.locations.replace(self.locations.indexOf(oldLocation), new location(value)); 
self.locations.valueHasMutated(); 

Ho anche provato

self.locations[self.locations.indexOf(location)] = new fizi.ko.models.location(value); 

Ma niente sta funzionando. L'indice viene correttamente recuperato ma l'aggiornamento dell'articolo non sta accadendo.

+0

Cosa intendi con "Ma niente funziona?"? Non hai il nuovo elemento nell'array? O non vedi la sostituzione nell'interfaccia utente? Per favore pubblica il tuo html e le associazioni e anche come appare un oggetto posizione! – nemesv

+0

entrambi. Il modello non è aggiornato e nessuno dei due è l'interfaccia utente poiché il modello non è aggiornato. – bflemi3

risposta

45

La funzione di sostituzione accetta due parametri, l'elemento che si desidera sostituire e il nuovo articolo con cui si desidera sostituirlo. Stai passando l'indice al posto dell'elemento da sostituire, quindi non funziona.

La sostituzione dovrebbe essere chiamata:

self.locations.replace(oldLocation, new location(value)); 

Su un lato nota, non dovrebbe essere necessario la chiamata valueHasMutated() lì, otterrà invocato dalla chiamata replace().

+9

Devo chiedere, dove su la terra è la documentazione che menziona il metodo di sostituzione su un array osservabile? Ho guardato e guardato, e non ho potuto vederlo da nessuna parte nella documentazione! –

+4

@PaulManzotti - L'articolo 7 di http://www.knockmeout.net/2011/06/10-things-to-know-about-knockoutjs-on.html menziona i metodi aggiunti. – DaveB

+1

Grazie, terrò quella pagina segnata! :) –

1

Non sono a conoscenza di un metodo di sostituzione in JavaScript per gli array o in Knockout. Mi sto perdendo qualcosa?

Se si desidera utilizzare il secondo metodo, allora avete bisogno di accedere a luoghi come osservabile:

self.locations()[self.locations.indexOf(location)] = new fizi.ko.models.location(value); 
self.locations.valueHasMutated(); 

se non quando si utilizza indexOf, in quanto v'è una versione Knockout di quella per gli array osservabili .

+1

Non l'ho visto documentato da nessuna parte, ma è nel codice sorgente: https://github.com/knockout/knockout/blob/master/src/subscribables/observableArray.js –

4

Voglio semplicemente parlare di un modo alternativo per farlo:

self.locations.splice(
    self.locations.indexOf(location), // Index of the 1st element to remove 
    1,         // Number of elements to remote at this index 
    new fizi.ko.models.location(value) // A param for each element to add at the index 
); 

Knockout comprende splice nella sua documentazione, ma non include replace: Knockout Obervable Arrays Docs. Tuttavia, se guardi il codice sorgente vedrai che entrambe le funzioni sono implementate (almeno in KO 3.0, non so se nelle versioni precedenti non fosse presente replace).