因爲手頭有一個AngularJS項目,而其中消息模塊就是採用SignalR來推送。AngularJS就像天生須要SignalR同樣,由於他們都須要很快。其實更在乎的是WebSocket在AngularJS的應用,而當前只是一個小試驗,但效果然的很是好。這一篇文章,咱們圍繞AngularJS中如何應用SignalR,因此你看到的更多會是JavaScript腳本。javascript
項目是以ASP.NET API做爲服務端、OAuth2票據令牌認證、AngularJS作爲前端、中間所有采用JSON做爲數據傳輸。css
依賴jQuery.SignalR.js
這是必須的,而SignalR客戶端腳本庫又是以插件的形式,因此無論將來如何更新,都不擔憂腳本的變更而倒置AngularJS的改動,要知道AngularJS項目的JS腳本管理要控制得很是嚴謹。html
Hub代理腳本
其實我在SignalR JavaScript 客戶端已經很是詳細的描述過關於若是建立代理腳本,但有個缺點就是他是全局式的,而對於AngularJS而言不建議使用這種全局式的,因此咱們須要手動的建立代理腳本部分;而且把它看成一個 factory
,這樣對於多個Controller是能夠共享數據的。前端
這裏有個github的項目,徹底能夠知足咱們的需求,很是簡單,我把代理貼出來:java
angular.module('SignalR', []) .constant('$', $) .factory('Hub', ['$', function ($) { //This will allow same connection to be used for all Hubs //It also keeps connection as singleton. var globalConnections = []; function initNewConnection(options) { var connection = null; if (options && options.rootPath) { connection = $.hubConnection(options.rootPath, { useDefaultPath: false }); } else { connection = $.hubConnection(); } connection.logging = (options && options.logging ? true : false); return connection; } function getConnection(options) { var useSharedConnection = !(options && options.useSharedConnection === false); if (useSharedConnection) { return typeof globalConnections[options.rootPath] === 'undefined' ? globalConnections[options.rootPath] = initNewConnection(options) : globalConnections[options.rootPath]; } else { return initNewConnection(options); } } return function (hubName, options) { var Hub = this; Hub.connection = getConnection(options); Hub.proxy = Hub.connection.createHubProxy(hubName); Hub.on = function (event, fn) { Hub.proxy.on(event, fn); }; Hub.invoke = function (method, args) { return Hub.proxy.invoke.apply(Hub.proxy, arguments) }; Hub.disconnect = function () { Hub.connection.stop(); }; Hub.connect = function () { return Hub.connection.start(options.transport ? { transport: options.transport } : null); }; if (options && options.listeners) { angular.forEach(options.listeners, function (fn, event) { Hub.on