Ich implementiere eine Cache-Funktion in einer berechneten Observable.Bestimmen, ob Observable hat sich in berechnet geändert
Gibt es eine Möglichkeit, den Cache unten ungültig zu machen, wenn die items
Sammlung seit dem letzten Aufruf abweicht?
Ich habe Beispiele von Dirty Checking gesehen, wo eine serialisierte Version der Observable verwendet wird, um festzustellen, ob die Sammlung geändert wurde, aber es ist zu teuer für mich, da es Hunderte von Elementen geben kann.
var itemCache;
var manipulatedItems = ko.pureComputed(function(){
var items = someObervable();
if(!itemCache /* || someObervable.hasChangedSinceLastCall */) {
itemCache = heavyWork(items);
}
return itemCache;
});
var heavyWork = function(items){
// do some heavy computing with items
return alteredItems;
};
In meinem Viewmodel:
myViewModel.itemList = ko.pureComputed(function(){
var result = manipulatedItems();
return result;
});
Was versuchen Sie zu tun, die Sie noch nicht haben? Observables werden zwischengespeichert. Wenn sich 'someObservable' nicht geändert hat, gibt 'manipulatedItems' nur den zwischengespeicherten Wert zurück; Es wird nicht jedes Mal neu ausgeführt, wenn Sie seinen Wert erhalten. Wenn sich 'someObservable' ändert, aktualisiert Knockout den zwischengespeicherten Wert. –
@RoyJ Ah, mir war nicht bewusst, dass es nicht jedes Mal neu ausgeführt wurde. Problem gelöst durch Knockout dann denke ich :) Danke! – Johan
Beachten Sie, dass das Festlegen von 'someObservable' möglicherweise immer noch mehr Neubewertungen auslöst, als Sie möchten. Wenn es sich zum Beispiel um ein beobachtbares Array handelt, möchten Sie sicherstellen, dass Sie keine Objekte einzeln nacheinander anschieben. Sie könnten Ihrem 'pureComputed' ein' console.log' hinzufügen, wenn Sie ein Gefühl dafür bekommen möchten, wie oft der Wert ausgewertet wird. – user3297291