2015-11-02 79 views
2

我試圖使用SignalR.EventAggregatorProxy 庫,但我無法讓我的頭圍繞文檔或演示。我不需要使用Ninject,我只需要在服務器端和Angular SPA上使用WEB API的簡單測試應用程序。SignalR.EventAggregatorProxy簡單示例問題

這是我到目前爲止有:

Startup.cs

public class Startup 
{ 
    public void Configuration(IAppBuilder app) 
    { 
     app.MapSignalR(); 

     var proxy = new Lazy<IEventAggregator>(() => new Eventer()); 
     GlobalHost.DependencyResolver.Register(typeof(IEventAggregator),() => proxy.Value); 

     app.MapEventProxy<Message>(); 
    } 
} 

消息類

public abstract class Message {} 

public class MyMessage : Message 
{ 
    public int Number { get; set; } 
} 

Eventer.cs類射擊事件

public class Eventer : IEventAggregator 
{ 
    public void Subscribe(Action<object> handler) 
    { 
     Task.Factory.StartNew(() => 
     { 
      int number = 0; 

      while (true) 
      { 
       handler.Invoke(new MyMessage { Number = number++ }); 
       System.Threading.Thread.Sleep(1000); 
      } 
     }); 
    } 
} 

簡單的應用程序.js

(function() { 
    'use strict'; 

    var app = angular.module("TestApp", ['signalR.eventAggregator']); 

    app.controller("TestCtrl", ['$scope','$http', function ($scope, $http) { 

     function onEvent(e) { 
      console.log("event received => ", e); 
     }; 

     $scope.eventAggregator().subscribe(EventAgrTest.Events.MyMessage, onEvent); 

     $scope.headerText = "HEADER"; 
    }]); 
})(); 

和index.html

<!DOCTYPE html> 
<html xmlns="http://www.w3.org/1999/xhtml" ng-app="TestApp"> 
<head> 
    <title></title> 

    <script src="Scripts/jquery-1.6.4.js"></script> 
    <script src="Scripts/jquery.signalR-2.2.0.js"></script> 
    <script src="Scripts/jquery.signalR.eventAggregator-1.4.141.0.js"></script> 
    <script src="/signalr/hubs"></script> 
    <script src="/eventAggregation/events"></script> 
</head> 
<body ng-controller="TestCtrl"> 

    <h1>{{headerText}}</h1> 

    <script src="Scripts/angular.js"></script> 
    <script src="Scripts/jquery.signalR.eventAggregator.angular-1.4.143.0.js"></script> 

    <script src="Scripts/app.js"></script> 
</body> 
</html> 

當我運行應用程序我得到:指向錯誤 「類型錯誤無法讀取屬性未定義的 '訂閱'」 排隊

signalR.eventAggregator.subscribe(type, function(e) { ... 

在jquery.signalR.eventAggregator.angular-1.4.143.0.js

我敢肯定,我失去了一些東西,但我不知道是什麼。

Wiki中有一部分叫做Implement約束處理程序(https://github.com/AndersMalmgren/SignalR.EventAggregatorProxy/wiki/Implement-constraint-handlers),它應該像從抽象類繼承一樣簡單,但我不確定需要從這個類繼承什麼。

console output

回答

1

問題更新Invoke方法是JS的順序index.html文件中的依賴關係。

<script src="/signalr/hubs"></script> 

前應

<script src="Scripts/jquery.signalR.eventAggregator-1.4.141.0.js"></script> 

這是應該的樣子......

<script src="Scripts/jquery-1.6.4.js"></script> 
<script src="Scripts/jquery.signalR-2.2.0.js"></script> 
<script src="/signalr/hubs"></script> 
<script src="Scripts/jquery.signalR.eventAggregator-1.4.141.0.js"></script> 
<script src="/eventAggregation/events"></script> 

<script src="Scripts/angular.js"></script> 
<script src="Scripts/jquery.signalR.eventAggregator.angular-1.4.143.0.js"></script> 

它確實使感......現在......

+1

啊,真的錯過了。將在文檔中更清楚地說明。我可能會在將來更改,以便客戶端腳本(jquery.signalR.eventAggregator-1.4.141.0.js)不直接使用事件聚合器。那麼這個命令並不重要。這將是一個突破性的變化,因爲那麼庫的用戶需要使用事件聚合器 – Anders

+2

我確保這不會再發生https://github.com/AndersMalmgren/SignalR.EventAggregatorProxy/commit/f438fe7994b1151d296bd6534cde1657f81cc2a8 – Anders

1

IM庫的作者,

它不是設計爲使用簡單數據類型的消息。

需要例如

public abstract class Message {} 

消息基類的配置變化創建一個實際的消息

public class MyMessage : Message 
{ 
    public int Number { get;set; } 
} 

現在使用的基類,這是一種讓庫知道消息應代表javascript

app.MapEventProxy<Message>(); 

在您的事件代理更改爲

handler.Invoke(new MyMessage { Number = number++ }); 
在您的客戶端更改

我們

$scope.eventAggregator().subscribe(EventAgrTest.Events.MyMessage, onEvent); 

我應該採取類型的對象採取泛型類型與約束類

+0

謝謝您!這已經解釋了一點,但錯誤仍然存​​在。我已經更新了這個問題,以包含你的提示。此外還有另一個錯誤「Uncaught TypeError:CAn未讀取屬性的客戶端未定義」引用到jquery.signalR.eventAggregator-1.4.141.0.js行152. – vidriduch

+0

是否真的代理EventAgrTest.Events.MyMessage正確?如果你做console.log(EventAgrTest.Events.MyMessage)它是一個對象嗎?控制檯中有任何其他錯誤? – Anders

+0

我希望是。上面的代碼反映了我正在運行的那個。我已添加控制檯日誌的控制檯屏幕截圖EventAgrTest.Events.MyMessage ... – vidriduch