Концентраторы Signalr (1.0.0-alpha2) - можно ли добавлять клиентские функции после запуска соединения?
Используя 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 в a другой объект после запуска хаба подписывается на новые события, которые исходному коду были безразличны.
Реальный пример: панель мониторинга с рядом различных событий концентратора (новые посещения сайта, сообщение чата, ошибка сайта). Я "подписываюсь" после запуска соединения, а затем передаю свой прокси-сервер-концентратор всем моим различным компонентам пользовательского интерфейса для обработки их конкретных "типов сообщений". Должен ли я создавать отдельные концентраторы для них или я должен иметь возможность добавить больше серверных клиентских функций на муха?
2 ответа:
Да, вы можете. Используйте.по методам.
Пример:
myHub.on('somethingNew', function() { alert("This was called after the connection started!"); });
Если вы хотите удалить его позже, используйте .выключите метод.
У меня точно такая же ситуация. Вы можете рассмотреть возможность добавления другого макета абстракции, если вы пытаетесь вызвать его из нескольких мест.
Вот предварительная версия того, что я придумал (машинопись).Я начну с использования.
SignalRManager
- это мой класс "менеджер", который абстрагирует мой хабdebuggingHub
. У меня есть клиентский методfooChanged
, который запускается на сервере.Где-то в модуле, использующем SignalR, я просто вызываю метод
start
, который не является перезапускается, если уже запущен.// ensure signalR is started SignalRManager.start().done(() => { $.connection.debuggingHub.server.init(); });
Ваш "модуль" просто регистрирует свой обратный вызов через класс manager, и всякий раз, когда запускается метод клиента 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; } } }
Примечание: может потребоваться дополнительная работа для обработки разъединений или связи потеряны.