我试图使用SignalR.EventAggregatorProxy 图书馆,但我无法理解文档或演示。我不需要在服务器端和Angular SPA上使用WEB API的非常简单的测试应用程序之后使用Ninject和我。
这是我到目前为止所做的:
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);
}
});
}
}
简单的app.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>
当我运行应用时,我得到&#34; TypeError:无法读取属性&#39;订阅&#39;未定义&#34;错误指向行
signalR.eventAggregator.subscribe(type, function(e) { ...
in jquery.signalR.eventAggregator.angular-1.4.143.0.js
我确定我错过了什么,但我不确定是什么。
Wiki中有一部分称为实现约束处理程序(https://github.com/AndersMalmgren/SignalR.EventAggregatorProxy/wiki/Implement-constraint-handlers),它应该像从继承类继承一样简单,但我不确定需要从这个类继承什么。< / p>
答案 0 :(得分:1)
我是图书馆的作者,
它不是设计为使用简单的数据类型作为消息。
您需要一个消息基类,例如
public abstract class Message {}
创建实际消息
public class MyMessage : Message
{
public int Number { get;set; }
}
现在在配置更改中使用基类,这是一种让库知道哪些messagss应该被代理到javascript的方法
app.MapEventProxy<Message>();
在您的活动中代理更改为
handler.Invoke(new MyMessage { Number = number++ });
现在在您的客户端更改为
$scope.eventAggregator().subscribe(EventAgrTest.Events.MyMessage, onEvent);
我应该更新Invoke方法,使类型对象采用约束类
的泛型类型答案 1 :(得分:1)
问题出在index.html文件中的JS依赖项的顺序。
<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>
它确实有意义......现在......