2012-10-29 4 views
6

Ich bin derzeit einige Ember-Arrays wie so beobachtet:Ember.js: @each Beobachten, aber Iterieren nur über neue/geänderte Produkte

observe_array: function() { 
    this.get("my_array").forEach(function(e,i) { 
     // do something 
    }); 
}.observes("[email protected]"); 

Die meiste Zeit, wenn my_array aktualisiert wird, werden mehrere Elemente hinzugefügt am Einmal. Der Beobachter feuert jedoch nacheinander, wenn jedes Element hinzugefügt wird, was äußerst ineffizient wird. Gibt es das ohnehin effizienter? Im Wesentlichen muss ich in der Lage sein, ein mutiertes Array basierend auf "my_array" zu haben

Als Referenz werden realistische Größen von my_array zwischen 600-1200 Elemente sein. Der Block "tu etwas" beinhaltet einige Operationen, die etwas länger dauern - indem Sie Date-Objekte aus Strings erstellen und jedes Element in eine json-Repräsentation konvertieren.

Statt einen Beobachter zu tun, habe ich versucht, eine Eigenschaft mit der Cache gespeichert werden() Methode/Flagge, aber dass der Naht nicht Dinge sehr zu beschleunigen ....

+0

wissen Sie, wenn Sie Array aktualisiert? –

+0

@ sly7_7 Ich fürchte, ich verstehe nicht ganz, was Sie fragen, oder zumindest welche Art von Antwort Sie suchen. Das Array ist eigentlich ein Ember-Data-Record-Array und repräsentiert alle Elemente, die von einem bestimmten Modell geladen werden. –

+0

Sie geben mir eine gute Antwort, auch wenn meine Frage ein Mist war ^^. Versuchen Sie my_array.isLoaded zu beobachten und sehen, ob es besser :) ist –

Antwort

1

Unter der Annahme (über Kommentare), dass Ihre Array ist ein Ember-Daten gefüllt, sollten Sie versuchen, die Eigenschaft array.isUpdating zu beobachten. Ich hatte Erfolg mit diesem.

Der einzige Nachteil ist, dass es nur eingestellt wird, wenn .findAll() verwendet wird! (so Model.find())

+0

Nun, hier ist, was ich am Ende tun: ich habe einen „filteredData“ Filter, der im wesentlichen ein store.filter auf meinem Modell. Zuvor habe ich versucht, isLoading, isUpdating usw. auf dieser Seite zu beobachten ... aber es wurde jedes Mal ausgelöst, wenn ein Element hinzugefügt wurde. Getrennt fragte ich nach Elementen, indem ich store.findQuery verwendete. Am Ende habe ich nur isLoading auf store.findQuery beobachtet, das nur einmal ausgelöst wird, nachdem alle Elemente geladen wurden. –