2012-11-21 19 views
8

सिग्नलर (1.0.0-अल्फा 2) का उपयोग करके, मैं जानना चाहता हूं कि कनेक्शन शुरू होने के बाद क्लाइंट फ़ंक्शंस जोड़ना संभव है या नहीं।सिग्नलर (1.0.0-अल्फा 2) हब्स - क्या कनेक्शन शुरू होने के बाद आप क्लाइंट फ़ंक्शन जोड़ सकते हैं?

कहें कि मैं अपना कनेक्शन बनाता हूं और प्रॉक्सी लेता हूं। फिर मैं कुछ चीजें करने के लिए हब में कुछ सर्वर निकाल दिया गया क्लाइंट फ़ंक्शन जोड़ता हूं। तब मैं अपना कनेक्शन शुरू करता हूं। मैं फिर अपने हब ऑब्जेक्ट में कुछ और सर्वर निकाले गए कार्यों को जोड़ना चाहता हूं। क्या यह संभव है?

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' चर भेजने के लिए के बाद केंद्र नई घटनाओं है कि मूल कोड के लिए परवाह नहीं की सदस्यता के लिए शुरू कर दिया है चाहता हूँ।

वास्तविक जीवन उदाहरण: कई अलग-अलग हब घटनाओं (नई साइट विज़िट, चैट संदेश, साइट त्रुटि) के साथ एक डैशबोर्ड। कनेक्शन शुरू होने के बाद मैं 'सब्सक्राइब' करता हूं और फिर अपने विशिष्ट 'संदेश प्रकारों' को संभालने के लिए अपने सभी यूआई घटकों को अपने हब प्रॉक्सी पास करता हूं। क्या मुझे इनके लिए अलग-अलग हब बनाना चाहिए या क्या मुझे फ्लाई पर अधिक सर्वर निकाले गए क्लाइंट फ़ंक्शंस को जोड़ने में सक्षम होना चाहिए?

उत्तर

14

हाँ आप कर सकते हैं। .on विधि का प्रयोग करें।

उदाहरण:

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

आप बाद में इसे हटा .off विधि का उपयोग करना चाहते हैं।

+6

प्रारंभ करने से पहले आपको कम से कम एक सदस्यता की आवश्यकता है। – davidfowl

+1

@dfowler यह है कि प्रति हब या कुल मिलाकर एक सदस्यता? क्या सब्सक्रिप्शन का मतलब सर्वर से कॉल करने के लिए पहले से ही एक फ़ंक्शन है? – Rangoric

+1

प्रति हब। सदस्यता का मतलब है कि आपके पास क्लाइंट साइड पर कॉलबैक परिभाषित है। – davidfowl

0

मेरे पास एक ही स्थिति है। यदि आप इसे कई स्थानों से कॉल करने का प्रयास कर रहे हैं तो आप अमूर्तता का एक और लेआउट जोड़ने पर विचार करना चाहेंगे।

यहां जो कुछ आया है उसका एक प्रारंभिक संस्करण है (टाइपस्क्रिप्ट)।

मैं उपयोग के साथ शुरू करूंगा। SignalRManager मेरा 'प्रबंधक' वर्ग है जो मेरे debuggingHub केंद्र को सार तत्वित करता है। मेरे पास क्लाइंट विधि fooChanged है जो सर्वर पर ट्रिगर की गई है।

साइनलआर I का उपयोग कर रहे मॉड्यूल में कहीं भी 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'); 
    } 
}); 

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

नोट: डिस्कनेक्शन या कनेक्शन खोने के लिए अतिरिक्त कार्य शामिल हो सकते हैं।