2012-11-21 25 views
8

Sử dụng Signalr (1.0.0-alpha2), tôi muốn biết liệu có thể thêm các chức năng của máy khách sau khi kết nối đã được bắt đầu hay không.Trung tâm Signalr (1.0.0-alpha2) - Bạn có thể thêm các chức năng của khách hàng sau khi kết nối đã được bắt đầu không?

Giả sử tôi tạo kết nối và lấy proxy. Sau đó, tôi thêm một số chức năng máy khách được kích hoạt của Máy chủ vào trung tâm để thực hiện một số việc. Sau đó, tôi bắt đầu kết nối của tôi. Sau đó tôi muốn thêm một số chức năng của Máy chủ được kích hoạt vào đối tượng trung tâm của tôi. Điều này có thể không?

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

Ví dụ này không thực tế, nhưng về cơ bản tôi muốn gửi biến 'myHub' của mình sang một đối tượng khác sau khi trung tâm bắt đầu đăng ký các sự kiện mới mà mã ban đầu không quan tâm.

Ví dụ thực tế về cuộc sống: Trang tổng quan có một số sự kiện trung tâm khác nhau (lượt truy cập trang web mới, tin nhắn trò chuyện, lỗi trang web). Tôi 'đăng ký' sau khi kết nối đã bắt đầu và sau đó vượt qua proxy trung tâm của tôi cho tất cả các thành phần giao diện người dùng khác nhau của tôi để xử lý 'loại thông báo cụ thể' của họ. Tôi có nên tạo các Hub riêng biệt cho những điều này hoặc tôi có thể bổ sung thêm các chức năng máy khách được kích hoạt của Máy chủ khi đang chạy không?

Trả lời

14

Có thể. Sử dụng phương thức .on.

Ví dụ:

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

Nếu bạn muốn loại bỏ nó sau này sử dụng phương pháp .off.

+6

Bạn cần phải có ít nhất một đăng ký trước khi bắt đầu gọi. – davidfowl

+1

@dfowler là một đăng ký cho mỗi trung tâm hoặc tổng cộng? Ngoài ra, thuê bao chỉ có nghĩa là đã có một chức năng cho máy chủ để gọi? – Rangoric

+1

Mỗi trung tâm. Đăng ký nghĩa là bạn có một cuộc gọi lại được xác định ở phía máy khách. – davidfowl

0

Tôi có cùng một tình huống giống nhau. Bạn có thể muốn xem xét thêm một bố cục trừu tượng khác nếu bạn đang cố gọi nó từ nhiều nơi.

Đây là phiên bản sơ bộ về những gì tôi đã đưa ra (bản ghi).

Tôi sẽ bắt đầu sử dụng. SignalRManager là lớp 'người quản lý' của tôi tóm tắt trung tâm debuggingHub của tôi. Tôi có một phương pháp khách hàng fooChanged được kích hoạt trên máy chủ.

Ở đâu đó trong mô-đun đang sử dụng SignalR, tôi chỉ cần gọi phương thức start, không được khởi động lại nếu đã bắt đầu.

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

'Mô-đun' của bạn chỉ đăng ký gọi lại thông qua lớp người quản lý và bất cứ khi nào phương thức SignalR được kích hoạt, trình xử lý của bạn được gọi.

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

Đây là một phiên bản đơn giản của SignalRManager sử dụng jQuery $.Callbacks để vượt qua trên yêu cầu như nhiều mô-đun như bạn có. Tất nhiên bạn có thể sử dụng bất kỳ cơ chế nào bạn muốn, nhưng điều này có vẻ là đơn giản nhất.

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

Lưu ý: có thể có thêm công việc liên quan đến xử lý ngắt kết nối hoặc mất kết nối.

Các vấn đề liên quan