2015-11-02 130 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