2013-06-09 6 views
7

Also integriere ich SignalR und HotTowel, obwohl ich wirklich denke, dass dies eine Frage der Integration mit Durandal selbst ist.HotTowel (Durandal wirklich) und SignalR Initialisierung

Das Problem ist, ich habe offensichtlich mehrere Ansichten. Einige dieser Ansichten möchte ich auf SignalR-Nachrichten antworten. Die Frage ist, wie man diese Integration durchführt, wenn man bedenkt, dass SignalR-Ereignisse gestartet werden müssen, bevor ich die Hub-Start-Methode von SignalR aufruft.

Also nimm das Beispiel Ich habe view1 und view2. Ich möchte, dass jeder etwas macht, wenn eine SignalR-Nachricht empfangen wird und im Zusammenhang mit dieser Ansicht (also, sagen wir mal, das DOM irgendwie aktualisieren). Es ist offensichtlich, dass ein Aufruf der SignalR-Startmethode für jede Ansicht eine schlechte Idee ist. Das Starten von SignalR beim Booten klingt also nach dem richtigen Plan, aber zu diesem Zeitpunkt waren meine Ansichten möglicherweise nicht geladen, und trotzdem würde ich das sicherstellen Meine Ereignisse haben den richtigen Kontext für die Seite.

Dies basiert auf meinem Verständnis, dass alle Ereignisse für SignalR registriert werden müssen, bevor ich den Start anrufe. Irgendwelche Gedanken schlaue Leute von StackOverflow?

Bearbeiten auf dem Problem

Einen Teil der Website beinhaltet das Hochladen von Dateien für die Analyse und Verarbeitung erweitern in eine Datenbank zu importieren. Ich habe eine Ansicht erstellt, in der die Datei ausgewählt und mit FineUploader auf einen WebApiController hochgeladen wird. Der Controller führt die grundlegenden Schritte zum Überprüfen der hochgeladenen Datei durch und startet dann eine asynchrone Task, um die Analyse und Verarbeitung tatsächlich durchzuführen, während die grundlegende Nachricht "Ja, die hochgeladen wurde" sofort zurückgegeben wird.

Dadurch wird die Liste der laufenden Dateien aktualisiert, und die Datei wird mit dem Status "Hochgeladen" angezeigt. Wenn die Async-Aufgabe auftritt, wird die Datei analysiert, dann für ein Regelsystem verarbeitet und schließlich in einen anderen Back-End-Datenspeicher importiert. Wenn diese Statusänderungen auftreten, sendet SignalR Nachrichten an den Client, um sie über diese Änderungen zu benachrichtigen und somit den Status anhand des Dateinamens zu aktualisieren. Damit dies geschieht, muss ich eine Funktion an das Ereignis anhängen, wie es in SignalR empfangen wurde. Das braucht sogar irgendeine Art von Bezug zu meiner Ansicht (eigentlich Viewmodel), damit es den korrekten Wert aktualisieren kann.

Als SignalR sollte einmal mit einem Aufruf von Hub.Start() gestartet werden, versuche ich es während der Boot-Phase zu tun. Wenn jedoch mein SPA gestartet wird, wurde diese Ansicht nicht geladen und daher auch nicht mit diesem Ansichtsmodell, und daher kann meine Funktion, die für die Initialisierung von SignalR verantwortlich ist, kein Verständnis für das Ansichts-/Ansichtsmodell haben, das sie aktualisieren muss.

Beispiele, die ich bei der Verwendung von SignalR gesehen habe, zeigen, dass es in einer Ansicht verwendet wird, aber das funktioniert nicht wirklich, wenn Sie es in mehreren Ansichten benötigen (Sie können nicht einfach weiterhin hub.start() aufrufen))

Entschuldigung, wenn das immer noch keinen Sinn ergibt, poste ich etwas Code oder sowas.

+1

Können Sie das Problem beschreiben, das Sie versuchen, etwas mehr zu lösen? Und was hast du probiert? –

Antwort

9

Wenn Sie

$.connection.myHub.on("myMethod", function (/* ... */) { /* ... */ }); 

statt

$.connection.myHub.client.myMethod = function (/* ... */) { /* ... */ }; 

Sie clientseitige Hub Methoden nach dem Aufruf $.connection.hub.start() hinzufügen können;

+0

Ausgezeichnet! Genau die Technik, nach der ich gesucht habe. Ich google Dinge wie "signalR Event nach Hub Start" und irgendein Grund konnte einfach nichts finden, das diese Alternative beschreibt! Danke halter73! – Adam

+0

Nicht nur Durandal oder HotTowel, sondern jede SPA-Anwendung profitiert davon. Ich arbeite an einer Backbone, Underscore App und das behebt meine Probleme mit SignalR keine Push-Nachrichten zu erhalten. –

+1

Ich füge hinzu, dass Sie mindestens einen Callback pro Hub verdrahtet haben sollten, bevor Sie die Verbindung starten. Es spielt keine Rolle, ob der Callback no-ops. Sobald Sie das tun, sollten Sie in der Lage sein, einen Rückruf nach Belieben hinzuzufügen, selbst wenn die SignalR-Verbindung offen ist. – halter73