2013-03-15 12 views
31

Ich versuche, den gesamten Inhalt eines Artikels in einem observableArray mit neuem Inhalt zu ersetzen.Ersetzen Artikel in ObservableArray

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(); 

Ich habe auch versucht,

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

Aber nichts funktioniert. Der Index wird ordnungsgemäß abgerufen, aber die Aktualisierung des Elements findet nicht statt.

+0

Was meinst du mit "Aber nichts funktioniert."? Sie haben das neue Element nicht im Array? Oder Sie sehen die Ersetzung in der Benutzeroberfläche nicht? Bitte posten Sie Ihre HTML- und Bindings und auch wie ein Location-Objekt aussieht! – nemesv

+0

beide. Das Modell wird nicht aktualisiert und das ui wird auch nicht angezeigt, da das Modell nicht aktualisiert wird. – bflemi3

Antwort

45

Die Replace-Funktion akzeptiert zwei Parameter, den Artikel, den Sie ersetzen möchten, und den neuen Artikel, mit dem Sie ihn ersetzen möchten. Sie übergeben den Index anstelle des zu ersetzenden Elements, sodass es nicht funktioniert.

Der ersetzen Aufruf sollte sein:

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

Auf einer Seite beachten, sollten Sie nicht brauchen den valueHasMutated() Anruf gibt, wird es durch den replace() Aufruf aufgerufen erhalten.

+9

Ich muss fragen, wo auf Erde ist die Dokumentation, die die Ersetzungsmethode auf einem beobachtbaren Array erwähnt? Ich habe geschaut und geschaut und konnte es nirgends in der Dokumentation sehen! –

+4

@PaulManzotti - Artikel 7 von http://www.knockmeout.net/2011/06/10-things-to-know-about-knockoutjs-on.html erwähnt die hinzugefügten Methoden. – DaveB

+1

Danke, ich behalte diese Seite mit Lesezeichen! :) –

1

Mir ist nicht bekannt, eine Methode zum Ersetzen in JavaScript für Arrays oder in Knockout. Fehle ich etwas?

Wenn Sie Ihre zweite Methode verwenden möchten, dann müssen Sie Standorte als beobachtbare zuzugreifen:

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

wenn Sie nicht tun, wenn indexOf verwenden, da es eine Knockout-Version, dass für beobachtbare Arrays .

+1

Ich habe es nirgends dokumentiert gesehen, aber es ist im Quellcode: https://github.com/knockout/knockout/blob/master/src/subscribables/observableArray.js –

4

Ich möchte einfach eine alternative Möglichkeit zu erwähnen, es zu tun:

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 splice in seiner Dokumentation enthält, nicht jedoch replace: Knockout Obervable Arrays Docs. Wenn Sie sich jedoch den Quellcode ansehen, werden Sie sehen, dass beide Funktionen implementiert sind (zumindest in KO 3.0, ich weiß nicht, ob replace in früheren Versionen fehlte).