8

Signalr(1.0.0-alpha2)を使用して、接続開始後にクライアント関数を追加できるかどうかを知りたいです。

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

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コンポーネントに渡して、特定の「メッセージタイプ」を処理します。これら用に個別のハブを作成する必要がありますか、それともサーバー起動クライアント関数をその場で追加できるようにする必要がありますか?

4

2 に答える 2

14

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

例:

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

後で削除する場合は、.offメソッドを使用します。

于 2012-11-21T17:42:23.000 に答える
0

私はまったく同じ状況にあります。複数の場所からそれを呼び出そうとしている場合は、抽象化の別のレイアウトを追加することを検討することをお勧めします。

これが私が思いついたものの暫定版です(typescript)。

使い方から始めましょう。ハブSignalRManagerを抽象化する「manager」クラスです。サーバーでトリガーされるdebuggingHubクライアントメソッドがあります。fooChanged

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

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

'モジュール'は、マネージャークラスを介してコールバックを登録するだけで、SignalRクライアントメソッドがトリガーされるたびにハンドラーが呼び出されます。

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

SignalRManagerこれは、 jQuery$.Callbacksを使用してリクエストをできるだけ多くのモジュールに渡す単純なバージョンです。もちろん、任意のメカニズムを使用できますが、これが最も簡単なようです。

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

注:切断または失われた接続を処理するために、追加の作業が必要になる場合があります。

于 2015-05-28T07:44:13.383 に答える