我正在学习SignalR,我在Google Chrome的调试中遇到了这个错误:
Uncaught TypeError: Cannot read property 'MoveShape' of undefined
我在MVC中的集线器课程
public class MoveShapeHub : Hub
{
public void MoveShape(int x, int y)
{
Clients.Caller.shapeMoved(Context.ConnectionId, x, y);
}
}
Javascript文件
$(function () {
var hub = $.connection.MoveShapeHub;
var $shape = $('#shape');
$.extend(hub, {
shapeMoved: function (cid, x, y) {
if (cid !== $.connection.hub.id) {
$shape.css({ left: x, top: y });
}
}
});
$.connection.hub.start().done(function () {
$shape.draggable({
drag: function () {
hub.MoveShape(this.offsetLeft, this.offsetTop || 0);
}
});
});
});
HTML中的脚本重新添加
<script src="~/Scripts/jquery-ui-1.10.4.js"></script>
<script src="~/Scripts/jquery.signalR-2.0.3.js"></script>
<script src="/signalr/hubs"></script>
<script src="~/Scripts/Application/MoveShape.js"></script>
HTML
<div id="shape" style="width: 100px; height: 100px; background-color:#f00"></div>
答案 0 :(得分:1)
尝试这样做
var hub = $.connection.moveShapeHub;
答案 1 :(得分:1)
首先,您能否向我们展示您致电MapSignalR()
的启动课程?
假设你已经正确地完成了这件事,我看到的第一件事是关闭的:
var hub = $.connection.MoveShapeHub;
“/ signalr / hubs”脚本负责定义$.connection.moveShapeHub
。请注意如何使用JavaScript常用的较低驼峰大小写约定moveShapeHub
,而不是C#常用的Pascal大小写约定。
这意味着应该修改上面的行以使用较低的camel case约定:
var hub = $.connection.moveShapeHub;
如果您更喜欢使用Pascal案例,可以使用HubName属性。
[HubName("MoveShapeHub")]
public class MoveShapeHub : Hub
/ signalr / hubs脚本不会重新设置由HubName属性指定的名称。 http://www.asp.net/signalr/overview/signalr-20/hubs-api/hubs-api-guide-javascript-client#getproxy
其次,您应该将客户端集线器回调放在$.connection.moveShapeHub.client
对象上,而不是直接放在$.connection.moveShapeHub
上。这意味着$.extend(hub, { //...
应该是$.extend(hub.client, {
。
您还需要为所有脚本使用应用程序根相对路径,但 / signalr / hubs除外。如果您的应用程序根目录是域的根目录,这应该不是问题,但我会将/ signalr / hubs引用更改为app root相对于安全。