2012-11-21 9 views
8

Korzystanie z Signalr (1.0.0-alpha2), chcę wiedzieć, czy możliwe jest dodanie funkcji klienta po uruchomieniu połączenia.Koncentratory Signalr (1.0.0-alpha2) - czy można dodać funkcje klienta po uruchomieniu połączenia?

Powiedz, że tworzę połączenie i łapię proxy. Następnie dodajemy do koncentratora niektóre funkcje klienta Server Fired, aby wykonać kilka czynności. Wtedy zaczynam połączenie. Następnie chcę dodać kilka funkcji Server Fired do mojego obiektu centralnego. czy to możliwe?

var myHub= $.connection.myHub; 
myHub.SomeClientFunction = function() { 
    alert("serverside called 'Clients.SomeClientFunction()'"); 
}; 
$.connection.hub.start() 
    .done(function() { 
     myHub.SomeNewClientFunction = function() { 
     alert("serverside called 'Clients.SomeNewClientFunction()'"); 
     } 
    }) 

Ten przykład nie jest realistyczny, ale ja po prostu chcesz wysłać moje zmiennej „myHub” do innego obiektu po piasta jest uruchamiany do subskrypcji nowych wydarzeń, że oryginalny kod nie obchodzi.

Przykład rzeczywisty: pulpit z wieloma różnymi zdarzeniami w centrum wydarzeń (nowe wizyty w witrynie, wiadomość na czacie, błąd witryny). Subskrybuję po nawiązaniu połączenia, a następnie przekazuję moje proxy pośredniczące do wszystkich moich różnych składników interfejsu użytkownika, aby obsłużyć ich określone "typy wiadomości". Czy powinienem utworzyć dla nich osobne huby, czy powinienem móc dodać więcej funkcji klienta Server Fired w locie?

Odpowiedz

14

Tak, można. Użyj metody .on.

Przykład:

myHub.on('somethingNew', function() { 
    alert("This was called after the connection started!"); 
}); 

Jeśli chcesz go usunąć później użyć metody .off.

+6

Musisz mieć co najmniej jedną subskrypcję przed wywołaniem uruchomienia. – davidfowl

+1

@ffowler jest to jedna subskrypcja na serwer lub w całości? Czy subskrypcja oznacza po prostu posiadanie funkcji do połączenia z serwerem? – Rangoric

+1

Na koncentrator. Subskrypcja oznacza, że ​​masz wywołanie zwrotne zdefiniowane po stronie klienta. – davidfowl

0

Mam dokładnie tę samą sytuację. Być może warto rozważyć dodanie innego układu abstrakcji, jeśli próbujesz wywołać go z wielu miejsc.

Oto wstępna wersja tego, co wymyśliłem (maszynopis).

Zacznę od użycia. SignalRManager to moja klasa "menedżera", która usuwa mój koncentrator debuggingHub. Mam metodę klienta fooChanged, która jest wyzwalana na serwerze.

Gdzieś w module, który używa SignalR, po prostu wywołuję metodę start, która nie jest ponownie uruchamiana, jeśli już się rozpoczęła.

// ensure signalR is started 
SignalRManager.start().done(() => 
{ 
    $.connection.debuggingHub.server.init(); 
}); 

Twój „moduł” po prostu rejestruje swój zwrotnego poprzez klasy menedżera i gdy jest wyzwalany metoda obsługi klienta SignalR Twój nazywa.

// handler for foo changed 
SignalRManager.onFooChanged((guid: string) => 
{ 
    if (this.currentSession().guid == guid) 
    { 
     alert('changed'); 
    } 
}); 

Jest to prosta wersja SignalRManager który wykorzystuje jQuery $.Callbacks przekazać wniosek do tak wielu modułów, jak masz. Oczywiście możesz użyć dowolnego mechanizmu, który chciałeś, ale wydaje się to najprostsze.

module RR 
{ 
    export class SignalRManager 
    { 
     // the original promise returned when calling hub.Start 
     static _start: JQueryPromise<any>; 

     private static _fooChangedCallback = $.Callbacks(); 

     // add callback for 'fooChanged' callback 
     static onfooChanged(callback: (guid: string) => any) 
     { 
      SignalRManager._fooChangedCallback.add(callback); 
     } 

     static start(): JQueryPromise<any> 
     { 
      if (!SignalRManager._start) 
      { 
       // callback for fooChanged 
       $.connection.debuggingHub.client.fooChanged = (guid: string) => 
       { 
        console.log('foo Changed ' + guid); 
        SignalRManager._fooChangedCallback.fire.apply(arguments);      
       }; 

       // start hub and save the promise returned 
       SignalRManager._start = $.connection.hub.start().done(() => 
       { 
        console.log('Signal R initialized'); 
       }); 
      } 

      return SignalRManager._start; 
     } 
    } 
} 

Uwaga: może być wymagana dodatkowa praca w celu usunięcia rozłączeń lub utraconych połączeń.

Powiązane problemy