2016-07-30 2 views
1

Ich bin ein bisschen neu in der Meteorwelt und versucht, den Dreh raus, aber stecken geblieben auf etwas.Subskriptionsreaktivität ohne Benutzereingabe und eine Verschiebung Zeitrahmen in der Veröffentlichung

Ich möchte eine Untergruppe einer Anrufauflistung auf einer Seite anzeigen, die keine Benutzerinteraktion hat (siehe als Ankunfts- oder Abfahrtstafel an einem Bahnhof).

Ich habe eine Veröffentlichung, die Container eine Teilmenge von Anrufen mit einem Zeitraum.

Meteor.publish('currentcalls', function(){ 
    var start = moment().subtract(24, 'hours').toDate(); 
    var end = moment().add(24, 'hours').toDate(); 
    return Calls.find({appointment: {$gte: start, $lt: end}}); 
}); 

Ich mache ein Template-Abonnement mit einem Autorun auf der Vorlage.

Template.HomeLayout.onCreated(function() { 
    this.autorun(() => { 
     this.subscribe('currentcalls'); 
    }); 
}); 

Wenn ich einen Anruf in die Datenbank innerhalb des festgelegten Zeitrahmen von -24 Stunden und + 24 Stunden eingeben, erhält der Anruf auf der Vorlage angezeigt. Wenn ich einen lösche, wird er vom Display gelöscht. Wenn jedoch ein Anruf in der Datenbank mit einem Datum in der Zukunft und nicht innerhalb des in der Veröffentlichung festgelegten Zeitrahmens hinzugefügt wird, wird er nicht automatisch angezeigt, wenn die Zeit fortschreitet, es sei denn, es gibt einen Auslöser, der die Reaktivität verursacht das Abonnement/die Veröffentlichung mit Benutzerinteraktion.

Was wäre ein guter Ansatz, um sicherzustellen, dass die Anrufe, die schließlich in den sich ständig ändernden Zeitrahmen eintreten oder ihn verlassen, angezeigt oder aus dem Display entfernt werden?

habe ich versucht, die Veröffentlichung veröffentlichen, aber es wird einen Fehler in dem Konsolenprotokoll auf dem Server:

I20160730-11:47:03.521(0)? Ignoring duplicate publish named 'currentcalls' 

Für jetzt habe ich einen schnellen und schmutzige Neuladen der Seite habe.

Meteor.setInterval(function() { 
    window.location.reload(); 
}, 60000); 

Aber ich bin sicher, dass nicht der Meteor-Weg! ;-) Jeder möglicher Eingang geschätzt!

Antwort

0

Um eine mögliche Lösung auf meine eigene Frage zu bringen, was ich auf meiner ständigen Suche gefunden und jemanden zu helfen, dass das auch in Zukunft konfrontiert ist:

:

ich eine Lösung zu finden https://github.com/peerlibrary/meteor-reactive-publish

Es funktioniert wie ein Charme innerhalb meiner Problemeinstellung. Ich bin jedoch immer noch neugierig, ob es andere Lösungen oder Denkweisen gibt, die Reaktivität in Meteor zu nutzen, um Dinge zu lösen, wie ich sie vorgestellt habe.

bearbeiten: Hier ist ein Code, um meine Antwort mit dieser Bibliothek/Paket zu vervollständigen.

var start = new ReactiveVar(moment().subtract(24, 'hours').toDate()); 
var end = new ReactiveVar(moment().add(24, 'hours').toDate()); 

Meteor.setInterval(function() { 
    start.set(moment().subtract(24, 'hours').toDate()); 
    end.set(moment().add(24, 'hours').toDate()); 
}, 60000); 

Meteor.publish('currentcalls', function() { 
    this.autorun(function (computation) { 
     return Calls.find({appointment: {$gte: start.get(), $lt: end.get()}}); 
    }); 
}); 
Verwandte Themen