2012-11-21 5 views
8

Signalr(1.0.0-alpha2)を使用して、接続が開始された後にクライアント機能を追加できるかどうかを知りたい。Signalr(1.0.0-alpha2)ハブ - 接続の開始後にクライアント機能を追加できますか?

私の接続を作成し、プロキシを取得します。次に、ハブにいくつかのサーバー起動クライアント機能を追加して、いくつかのことを行います。それから私は私の接続を開始します。次に、ハブオブジェクトにServer Fired関数をいくつか追加します。これは可能ですか?

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()'"); 
     } 
    }) 

この例は現実的ではないですが、私は基本的にハブが元のコードがために気にしませんでした新しいイベントをサブスクライブするために開始された後、別のオブジェクトに私の「myHub」変数を送りたいです。

実生活の例:さまざまなハブイベント(新しいサイト訪問、チャットメッセージ、サイトエラー)を含むダッシュボード。接続が開始された後に私は購読しています。そして、自分のハブプロキシを私の異なるUIコンポーネントすべてに渡して、特定の「メッセージタイプ」を処理します。これらのために別々のハブを作成する必要がありますか、それとも、サーバーの起動クライアント機能をその場で追加する必要がありますか?

答えて

14

はいできます。 .onメソッドを使用します。

例:

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

あなたが後でそれを削除.offメソッドを使用する場合は

+6

startを呼び出す前に、少なくとも1つのサブスクリプションが必要です。 – davidfowl

+1

@dfowlerはハブごと、または合計で1つのサブスクリプションですか?また、サブスクリプションはサーバーが呼び出すための機能をすでに持っていることを意味しますか? – Rangoric

+1

ハブごと。サブスクリプションとは、クライアント側でコールバックが定義されていることを意味します。 – davidfowl

0

私はまったく同じ状況です。複数の場所から呼び出す場合は、抽象概念の別のレイアウトを追加することを検討してください。

ここでは、私が思い描いているもの(タイスクリプト)の暫定版です。

使い方から始めます。 SignalRManagerは私のdebuggingHubハブを抽象化する私の 'マネージャ'クラスです。サーバー上でトリガーされたクライアントメソッドfooChangedがあります。

SignalRを使用しているモジュールのどこかで、すでに開始されている場合は再起動されないstartメソッドを呼び出すだけです。

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

あなたの 'module'は単にマネージャクラスを介してコールバックを登録し、SignalRクライアントメソッドが呼び出されるたびにハンドラが呼び出されます。

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

これは、あなたが持っている限り多くのモジュールに要求を渡すためにjQueryの$.Callbacksを使用していますSignalRManagerの簡易版です。もちろん、あなたが望むどんなメカニズムも使用できますが、これは最も単純なようです。

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; 
     } 
    } 
} 

注:切断や接続の切断には、余分な作業が必要になることがあります。

関連する問題