2013-06-09 21 views
7

Tak więc integruję SignalR i HotTowel, chociaż naprawdę uważam, że jest to kwestia tego, jak zintegrować się z samym Durandalem.HotTowel (Durandal naprawdę) i inicjalizacja SignalR

Problem polega na tym, że mam oczywiście wiele widoków. Niektóre z tych widoków chcę odpowiedzieć na wiadomości SignalR. Pytanie brzmi, jak wykonać tę integrację, biorąc pod uwagę, że zdarzenia SignalR muszą zostać uruchomione, zanim zadzwonię do metody startowej SignalR.

Weźmy więc przykład Mam view1 i view2. Chcę, aby każdy coś robił po odebraniu komunikatu SignalR iw kontekście tego widoku (powiedzmy, jakoś zaktualizuj DOM). To oczywiście SPA, więc wywoływanie metody SignalR start dla każdego widoku wydaje się złym pomysłem, więc uruchomienie SignalR raz podczas rozruchu brzmi jak właściwy plan, ale w tym momencie moje widoki mogły nie zostać załadowane, a mimo to w jaki sposób zapewnić, że moje wydarzenia mają odpowiedni kontekst dla strony.

Jest to oparte na moim zrozumieniu, że wszystkie zdarzenia związane z SignalR muszą zostać zarejestrowane przed rozpoczęciem połączenia. Wszelkie myśli sprytnych ludzi StackOverflow?

Edit rozszerzyć na problemie

część strony internetowej wiąże się z przesyłaniem plików do analizowania i przetwarzania importować do bazy danych. Stworzyłem widok, w którym plik został wybrany i przesłany (za pomocą FineUploadera) do WebApiController. Kontroler wykonuje podstawowe kroki sprawdzania przesłanego pliku, a następnie uruchamia zadanie asynchroniczne, aby faktycznie wykonać przetwarzanie i przetwarzanie, jednocześnie natychmiast zwracając podstawowy komunikat "Tak, to przesłane poprawnie".

Powoduje to odświeżenie listy plików "w toku", a plik pojawia się ze statusem "Przesłane". Podczas wykonywania zadania asynchronicznego plik jest przetwarzany, a następnie przetwarzany na system reguł, a następnie importowany do innej bazy danych zaplecza. Ponieważ każda z tych zmian statusu występuje, SignalR wysyła komunikaty do klienta, aby powiadomić o tych zmianach, a tym samym zaktualizować status względem nazwy pliku. Aby tak się stało, muszę dołączyć funkcję do zdarzenia, tak jak otrzymała SignalR. To nawet wymaga pewnego rodzaju odniesienia do mojego widoku (faktycznie viewmodel), aby mógł zaktualizować poprawną wartość.

Jako że SignalR powinien zostać uruchomiony raz z wywołaniem do hub.Start(), próbuję to zrobić podczas fazy rozruchowej. Jednak po uruchomieniu mojego SPA widok ten nie został załadowany i dlatego nie ma tego modelu widoku, a zatem moja funkcja odpowiedzialna za inicjowanie SignalR może nie mieć zrozumienia dla widoku/viewmodel, który musi zostać zaktualizowany.

Przykłady, które widziałem przy użyciu SignalR pokazują, że jest on używany w jednym widoku, ale to naprawdę nie działa na pewno, jeśli jest to potrzebne w wielu widokach (nie można tak po prostu wywoływać hub.start() można)?

Przepraszam, jeśli to nadal nie ma sensu, opublikuję jakiś kod lub coś takiego.

+1

Czy możesz opisać problem, który próbujesz rozwiązać? I co próbowaliście? –

Odpowiedz

9

Jeśli używasz

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

zamiast

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

można dodać metody po stronie klienta piasty po wywołaniu $.connection.hub.start();

+0

Doskonale! dokładnie tę technikę, której szukałem. Idę na coś takiego jak "signalR event after hub start" i jakiś powód nie mógł znaleźć niczego opisującego tę alternatywę! Dzięki halter73! – Adam

+0

Nie tylko Durandal lub HotTowel, ale każda aplikacja SPA korzysta z tego. Pracuję nad aplikacją Backbone, Underscore i rozwiązuje to moje problemy z SignalR, które nie otrzymują wiadomości Push. –

+1

Dodam, że przed uruchomieniem połączenia powinieneś mieć co najmniej jedno wywołanie zwrotne dla każdego koncentratora. Nie ma znaczenia, czy callback nie jest opcją. Gdy to zrobisz, powinieneś być w stanie dodać wywołania zwrotne, jak chcesz, nawet gdy połączenie SignalR jest otwarte. – halter73