2012-06-22 4 views
6

Gibt es eine Möglichkeit, ein beobachtbares Array automatisch zu sortieren, wenn eine gebundene Eigenschaft geändert wird? Ich glaube an das folgende Beispiel, meine Sicht wird aktualisiert, wenn ich eine neue Person hinzufüge, aber kann ich die Ansicht aktualisieren und meine Sortierfunktion anwenden, wenn eine der Personenalter geändert wird?Automatisch ko.observableArray als gebundene Eigenschaften ändern

person = { 
    age: ko.observable(); 
} 

viewModel = { 

    people: ko.observableArray([]), 

    someSortFunction: function() { 
     this.people.sort(function(person1, person2) { 
      return person2.age() - person1.age(); 
     }); 
    } 
} 

<div data-bind="foreach: people"> 
    <span data-bind="text: age"/> 
</div> 

Antwort

4

Sie können eine beobachtbare abonnieren und handeln, sobald sich der beobachtbaren Veränderungen:

person.age.subscribe(function (newValue) { 
    viewModel.someSortFunction(); 
}); 
+1

Hinweis: Es gibt Probleme mit diesem Ansatz ist, dass die von ihr angesichts wird sich bewusst sein wollen. Erstens: Um sicherzustellen, dass das beobachtbare Array kontinuierlich sortiert, müssen Sie die gleiche Eigenschaft für jedes Element im Array manuell abonnieren. Zweitens: Die Subskriptionen bleiben erhalten, es sei denn, Sie entfernen sie manuell für jedes Element, wenn Sie es aus dem beobachtbaren Array entfernen. Dies schafft das Potenzial für ein Speicherleck. Verwenden Sie diese Technik mit großer Sorgfalt. – Randolpho

+1

@Randolpho :: ziemlich wahr ... was scheinbar offensichtlich ist, kann zu einem Fehler führen, der ähnlich ist wie 'Uncaught RangeError: Maximale Call-Stack-Größe überschritten', in der 'subscribe' weiterhin pro Sortierung ausgeführt wird ... und niemals stoppt – beauXjames