Reaktive Sammlungsabfrage in einer Vorlage
-
11-12-2019 - |
Frage
Ich habe ein Template
genannt movies
, das über eine Methode verfügt, die eine Liste von Objekten aus einer Sammlung zurückgibt.Die Abfrage zum Generieren dieser Objektliste wird dynamisch unter Verwendung von Daten aus einer anderen Vorlagenmethode erstellt.
Ich möchte die Vorlage oder nur die mit dieser bestimmten Vorlagenmethode verknüpften Komponenten neu rendern, wenn sich die Filterdaten ändern.
Hier sind die beiden verwendeten Methoden:
Template.movies.filter = function () {
if (Session.equals("filter", undefined)) {
return {};
}
return Session.get("filter");
};
Template.movies.movies = function () {
return Movies.find(Template.movies.filter(), {sort: [["Poster", "desc"]]});
};
Auf der HTML-Seite ist es einfach {{#each movies}}{{> movie}}{{/each}}
um die Ergebnisse aus dem anzuzeigen movies
Methode.
Das Problem ist das wann Session.get("filter")
ändert sich und tut dies auch Template.movies.filter()
, die HTML-Komponente, auf die sich verlässt Template.movies.movies()
Die Daten werden nicht mit den neuen Abfrageergebnissen aktualisiert.
Wie würde ich dieses Verhalten erreichen?
Lösung
Der einfachste Weg besteht darin, einfach eine Javascript-Funktion zu erstellen, die beide Helfer nutzen:
var getFilter = function() {
if (Session.equals("filter", undefined)) {
return {};
}
return Session.get("filter")
}
Template.movies.filter = function() { return getFilter(); }
Template.movies.movies = function () {
return Movies.find(getFilter(), {sort: [["Poster", "desc"]]});
};
Dies wird wie erwartet reagieren.