2012-06-26 44 views
20

我承认,我不知道我在做什么。

我正在尝试学习如何使用SignalR,并且我几乎逐字地追踪了各种示例,并且无法粘贴$ .connection未定义。我正在使用MVC 4.0,并尝试使用nuget下载的signalR js文件或来自示例项目的文件。这些是我的脚本引用。

@Scripts.Render("~/Scripts/jquery-1.7.2.min.js") 
@Scripts.Render("~/Scripts/knockout-2.0.0.js") 
@Scripts.Render("~/Scripts/jquery.signalR.js") 
@Scripts.Render("~/signalr/hubs") 

脚本似乎加载 - 我甚至在他们开始时发出警报,但是$ .connection总是未定义的。在一个奇怪的事件中,我有一个不同的项目,我试图使用不同的jQuery库,它使用$。并且该对象也始终未定义。

我只是寻找任何可能的解释,我可能做错了什么。首先十分感谢。

+0

我们怎么帮助没有丝毫痕迹码? – Cranio

+3

你有没有在页面上包含两次jQuery? – davidfowl

回答

8

我解决了这个问题。我知道我做了什么,但我不知道为什么它确实起作用。

我在_Layout.cshtml视图的顶部引用了主jQuery库(版本1.7.2),但没有引用任何其他jQuery脚本。我注意到,默认情况下,它在视图的底部加载了

并且脚本部分位于该部分的下方。

@RenderSection("scripts", required:false) 

我进一步改变了我的脚本引用如图所示,并在问题出我的脚本引用上方

@section scripts 
{  
    @Scripts.Render("~/Scripts/jquery.signalR-0.5.1.js") 
    @Scripts.Render("~/Scripts/jquery.color.js") 
    @Scripts.Render("~/signalr/hubs") 
    @Scripts.Render("~/Scripts/blasht.signalr.js") 
} 

包装内对我的看法,使捆加载后,他们将包括放。我认为我没有加载所有必要的jQuery,因为它现在可以工作。

现在,如果我能弄清楚这是如何适用于我的其他项目。

3

这个工作原因是因为JavaScript文件的加载顺序。如果您在加载jquery之前尝试加载jquery.signalR-0.5.1.js,那么您将面对未定义的$ .connection,因为为此注册jquery应该先加载。在_Layout.cshtml模板脚本加载顺序

@Scripts.Render("~/bundles/jquery") 

@RenderSection("scripts", required: false) 

所以里面任何的你的意见,你可以在脚本部分加载signalr,这应该能正常运行。

44

今天我得到了同样的问题。

您的答案指出我在正确的方向,因为我有相同的脚本加载相同的设置。

我按照以下顺序将所有脚本标记放在页面顶部(头部)。

  • JQuery的
  • SignalR
  • /signalr /集线器
  • 我的脚本。JS

当然并且,@ Layout.cshtml是如此周到地在<body>标签的底部添加@Scripts.Render("~/bundles/jquery")

这是发生了什么事。

在此配置中,当页面加载时,它会按照它们指定的顺序加载头标记中的所有脚本。

所以它加载JQuery,然后SignalR,其中设置$.connection然后自动生成的集线器脚本,它设置$.connection.hubName,然后该网站的自定义脚本。

此时您的自定义代码将运行。但你的代码在某些时候,等待body.onloaddocument.onReady访问$.connection

的时候此事件之前,该布局模板增加了对你的身体标签也下载并执行结束脚本包。这个包还有jQuery库......它重置了$上的所有SignalR设置,现在你的$.connection不再被定义。

如何解决呢

易修复,确保你不加载JQuery的两倍,SignalR之前和之后SignalR一次一次。我将所有的脚本都移动到了包之后,并解决了问题。这里的最佳做法是使用模板提供的'脚本'部分。

@section scripts{ 
    @*/* load your scripts here. You can exclude jQuery, 
     coz it's already in the template */ *@ 
} 

所以这不是一个SignalR错误在所有...

这是2小时我的生活......我永远不会回来......

希望这有助于。

+1

太棒了,谢谢。仍然不起作用,但它让我更接近(在控制台中没有更多的错误)! – user1477388

+1

哦,上帝.....谢谢你的回答:) – Dzhambazov

+0

你的摇滚人...... !!它工作并保存了那些宝贵的“2小时的其他开发人员同样的问题”:) – Kings

2

我有同样的问题。 对我来说我已经在页面中包含jquery 2次,后来在布局中。 删除其中一个修复了问题。

希望它可以帮助

0

这发生在我身上,因为我动态加载jquery.signalR-1.1.4.js脚本之前加载~/signalr/hubs脚本。

当动态加载,没有错误存在,但是如果我拿了~/signalr/hubs输出并粘贴到我的Chrome浏览器开发工具,我收到一条错误消息VM1047:18 Uncaught Error: SignalR: SignalR is not loaded. Please ensure jquery.signalR-x.js is referenced before ~/signalr/hubs. at <anonymous>:18:15 at <anonymous>:300:2